【问题标题】:Having difficulty printing strings难以打印字符串
【发布时间】:2015-09-01 18:10:34
【问题描述】:

当我运行程序时,第二个printf() 打印string2,并将扫描到string1 的任何内容附加到末尾。

例如123 被扫描到 string1 然后打印:Is before "12ab123"。 而不是12ab

为什么不只是"12ab"

char string1[MAX_STR_LEN];
char string2[4]={'1','2','a','b'};
char five='5';
char abc[3]={'a','b','c'};
printf("Enter a string:");
scanf("%s", string1);
printf("Is before \"%s\":",string2);

【问题讨论】:

    标签: c arrays string printf scanf


    【解决方案1】:

    字符串是 C 中以空字符结尾的字符数组。

    改变

    char string2[4]={'1','2','a','b'};
    

    char string2[5]={'1','2','a','b', '\0'};
    

    (与char string2[] = "12ab";相同)

    【讨论】:

      【解决方案2】:

      你需要用NULL character as 来终止你的数组

      char string2[5]={'1','2','a','b','\0'};

      当您执行scanf() 时,string1 存储在下一个内存中,因此它正在打印string2string1。它将打印到它得到\0 所以它的Undefined Behavior

      【讨论】:

        【解决方案3】:

        在您的代码中

         char string2[4]={'1','2','a','b'};
        

        string2 不是以空值结尾的。使用该 array 作为%s 格式说明符的参数会调用未定义的行为,因为它会在搜索空终止符时经过分配的内存。

        你需要自己添加空终止符

        char string2[5]={'1','2','a','b','\0'};
        

        string2 用作字符串

        另外,你也可以写

        char string2[ ]= "12ab";
        

        允许编译器决定大小,它会考虑(并添加)空终止符的空间。

        abc 也一样。

        也就是说,您正在扫描string1 并打印string2,这当然没有错,但也没有多大意义。

        【讨论】:

        • char string2[ ]={'1','2','a','b'}; 也不是空终止的。
        • @BlueMoon 我真的需要睡觉了,这已经是漫长的一天。谢谢。明天见,换个思路:-)
        【解决方案4】:

        如果格式说明符 %s 没有精度标志,则函数输出字符,直到遇到零字符 '\0'

        字符数组string2 被定义为没有终止零

        char string2[4]={'1','2','a','b'};
        

        所以函数输出数组之外的字符,直到遇到零字符。

        您可以使用精度标志来明确指定要输出的字符数。例如

        printf("Is before \"%4.4s\":",string2);    
        

        或者您可以定义包含终止零的数组。例如

        char string2[5] = { '1', '2', 'a', 'b', '\0' };
        

        请注意,在这种情况下,如果指定了数组的大小,则它至少应等于 5(尽管大小可以大于 5;在这种情况下,其他没有初始值设定项的字符将为零 -初始化)

        或者干脆

        char string2[] = { "12ab" };
        

        或者不用大括号

        char string2[] = "12ab";
        

        【讨论】:

          【解决方案5】:

          扩展之前的答案,由于变量存储在堆栈内存中的顺序,字符串似乎是连接的。这在每个处理器架构或编译器上并不总是相同的(优化器设置也可以改变这种行为)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多