关于字符串的输入输出问题

img

img


想问一下为什么我定义的字符串长度为8但是输入了10个字符,还是可以正常输出啊

C语言字符串以'\0'(NULL)字符作为结尾标志,即使你定义的字符串长度小于输入的字符数,只要最后一个字符是'\0',依然会正常输出。如果最后一个字符不是'\0',那么输出时会一直往后读取直到遇到'\0'为止。这也很容易引起越界和内存崩溃等问题,因此在操作字符串时,需要格外注意保证字符串末尾必须是'\0'。

因为C语言出于效率的考虑,不会对数组是否越界进行检查,变量和变量中也许还有一些空隙(往往编译器会按照4的倍数对齐),所以造成略微越界,程序并不会表现出明显的错误。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7622422
  • 你也可以参考下这篇文章:连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组
  • 除此之外, 这篇博客: 递归法对任意10个数据按降序排序中的 裁判测试程序样例: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <stdio.h>
     void  sort(int a[],int n);
    int main()
    {
    int a[10],i;
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    sort(a,10);
    for(i=0;i<10;i++)
    printf("%3d",a[i]);
    return 0;
    }
    
  • 您还可以看一下 炮哥带你学老师的快速带你入门深度学习与实战课程中的 3.8、逻辑回归模型训练和测试小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    在C语言中,字符串是用字符数组来实现的。如果定义了一个字符数组,例如char str[8],那么它只有8个空间,也就是只能存放7个字符,因为最后一个字符要留给'\0'(用来表示字符串结束的字符)。但是,如果输入的字符个数超过了7个,那么会发生输入缓冲区溢出,会覆盖掉栈帧中的一些数据,因此可能会导致程序出错。所以,在输入字符串时,应该使用安全的输入函数,例如fgets,它可以指定输入缓冲区的大小,从而避免输入缓冲区溢出。

    下面是一个演示示例,使用fgets函数输入一个8字节的字符串。首先声明数组str和MAX_LENGTH,然后使用fgets函数输入一个指定长度的字符串,最后输出str字符串的长度。

    #include <stdio.h>
    #include <string.h>
    
    #define MAX_LENGTH 8
    
    int main()
    {
        char str[MAX_LENGTH];
        memset(str, 0, sizeof(str)); //将数组清零
        printf("请输入一个长度不超过%d的字符串:", MAX_LENGTH - 1);
        fgets(str, MAX_LENGTH, stdin); //使用fgets函数输入字符串
        printf("您输入的字符串是:%s\n", str);
        printf("字符串的长度是:%d\n", strlen(str));
        return 0;
    }
    

    输出结果: 请输入一个长度不超过7的字符串:1234567890 您输入的字符串是:12345678 字符串的长度是:8

    可以看到,输入的字符串超出了指定长度,但是只有前8个字符被保存到了数组中,并正确输出了字符串的长度为8。