Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个c程序会输出奇怪的字符?_C - Fatal编程技术网

为什么这个c程序会输出奇怪的字符?

为什么这个c程序会输出奇怪的字符?,c,C,下面的C代码在windows下用MinGW编译后,给出了我无法理解的输出 #include <stdio.h> main() { char s[100]; int i,c; for(i=0;i<100-1&&(c=getchar())!=EOF&&c!='\n';++i) s[i]=c; if(c=='\n'){ s[i]=c; ++i; } s[i]

下面的C代码在windows下用MinGW编译后,给出了我无法理解的输出

#include <stdio.h>
main()
{
    char s[100];
    int i,c;
    for(i=0;i<100-1&&(c=getchar())!=EOF&&c!='\n';++i)
        s[i]=c;
    if(c=='\n'){
        s[i]=c;
        ++i;
    }
    s[i]='p';
    printf("%s",s);
}
#包括
main()
{
chars[100];
int i,c;

for(i=0;ic中的字符串需要以null结尾。这意味着字符串的最后一个字符必须始终是
\0

这是你程序如何知道停止读字符串的地方,因为它是一个简单的数组:<代码> char < />代码>,它没有像你在高级语言中使用的长度信息,比如C++。


编辑:奇怪字符是读取有效字符后的内存结果。由于该内存不包含有效字符,因此可以以各种不可预测的方式进行解释。

c中的字符串需要以null结尾。这意味着字符串的最后一个字符必须始终是
\0

这是你程序如何知道停止读字符串的地方,因为它是一个简单的数组:<代码> char < />代码>,它没有像你在高级语言中使用的长度信息,比如C++。


编辑:奇怪字符是读取有效字符后内存产生的结果。由于该内存不包含有效字符,因此可能会以各种不可预测的方式对其进行解释。

此外,您还可能试图在声明的
s
范围之外分配一个值ne
s[100]
通过
s[99]
s[0]
处为您提供100个字符。您的代码可以尝试分配未定义的
s[100]
。具体来说:

for(i=0;i<100-1&&(c=getchar())!=EOF&&c!='\n';++i)
    s[i]=c;
仍然可以,但不能再次分配
s[i]
。然后分配
s[100]='p';
Kaboom!

s[i]='p';

(现在,它不会每次都失败,因为它是一个定时炸弹,随时可能爆炸——随机)。将此与另一个答案结合起来,你应该就可以了。

你还可能试图分配一个超出你声明的
s
范围的值。你定义
s[100]
通过
s[99]
s[0]
处为您分配100个字符。您的代码可以尝试分配未定义的
s[100]
。具体来说:

for(i=0;i<100-1&&(c=getchar())!=EOF&&c!='\n';++i)
    s[i]=c;
仍然可以,但不能再次分配
s[i]
。然后分配
s[100]='p';
Kaboom!

s[i]='p';

(现在,它并不是每次都会失败,因为它是一颗定时炸弹,随时都可能爆炸——随机)。将这一点与其他答案结合起来,您应该就可以了。

在开始使用之前,初始化程序中的数组始终是一种很好的做法 数组。这将避免在此类情况下打印垃圾字符


bzero(s,sizeof(char)*100);

在开始使用之前,初始化程序中的数组始终是一种很好的做法 数组。这将避免在此类情况下打印垃圾字符


b0(s,大小f(字符)*100)
s
不是空终止的。
s
不是空终止的。谢谢!好的,我知道。但是我想知道它为什么输出这些奇怪的字符,它们在哪里?当数组
s
创建时,它的内容是垃圾。您只初始化了其中的一部分;其余的包含垃圾,这就是正在打印的内容。如果您e“lucky”,垃圾中的某个地方碰巧有一个空字符,
printf
将在该点停止打印。如果没有,它将继续超过
s
的末尾,导致未定义的行为(它可能从内存中打印更多垃圾,或者它可能崩溃,或者更糟).@KeithThompson谢谢你对机制的详细解释。谢谢你对我的答案@KeithThompson@user15964的精彩补充。如果你觉得我的答案令人满意,请接受它,这样它就不会出现在未回答部分。谢谢!好的,我知道。但是我想知道为什么它会输出这些奇怪的字符,它们在哪里?什么时候数组
s
已创建,其内容是垃圾。您只初始化了其中的一部分;其余部分包含垃圾,这就是正在打印的内容。如果您“幸运”,垃圾中的某个地方碰巧有一个空字符,
printf
将在该点停止打印。如果没有,它将继续超过
s
的结尾,导致未定义的行为(它可能从内存中打印更多垃圾,或者可能崩溃,甚至更糟).@KeithThompson感谢您对机制的详细解释。感谢您为我的答案@KeithThompson@user15964添加的内容。如果您觉得我的答案令人满意,请接受它,这样它就不会出现在未回答部分。