fgets()函数字符限制的C编程?
示例代码:fgets()函数字符限制的C编程?,c,char,fgets,C,Char,Fgets,示例代码: int i; char word [10][15]; for (i = 0; i < 10; i++){ fgets(word[i], 16, stdin); } 输出: abcdefghijklmnopqrstuvwxyz pqrstuvwxyz 我不知道为什么会这样。在输入15个字符后,fgets()似乎不会停止 编辑: intj; 对于(j=0;j
int i;
char word [10][15];
for (i = 0; i < 10; i++){
fgets(word[i], 16, stdin);
}
输出:
abcdefghijklmnopqrstuvwxyz
pqrstuvwxyz
我不知道为什么会这样。在输入15个字符后,fgets()
似乎不会停止
编辑:
intj;
对于(j=0;j<10;j++){
printf(“%s”,单词[j]);
}
记住,在C编程语言中,每个字符串都以一个尾随的\0
字节结尾。fgets
函数读取的字符最多比您允许写入缓冲区的字符少一个,因此它可以使用\0
字节终止缓冲区中的字符串。现在,在您的代码中,您允许fgets
在word
中写入比word
中的每个char[15]
多一个字节。最初,word
数组如下所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...
^ ^ ^
word[0] word[1] word[2]
a b c d e f g h i j k l m n o \0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...
^ ^ ^
word[0] word[1] word[2]
其中,?
表示未定义的值。在您的代码第一次调用fgets
后,words
如下所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...
^ ^ ^
word[0] word[1] word[2]
a b c d e f g h i j k l m n o \0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...
^ ^ ^
word[0] word[1] word[2]
请注意,fgets
写入的字节比字[0]
中的空格多出一个字节,因此它写入了属于字[1]
的空格。但是,如果要使用printf
打印word[0]
的内容,字符串abcdefghijklmno
将打印为printf
打印,直到遇到\0
字节。现在看看第二次调用fgets
后word的样子:
a b c d e f g h i j k l m n o p q r s t u v w x y z \n\0? ? ? ? ? ? ...
^ ^ ^
word[0] word[1] word[2]
在这个调用中,fgets
不会写在单词[1]
的末尾之外,因为它在前面遇到了一个换行(\n
)字节。请注意,word[0]
中字符串的尾随\0
字节已被覆盖,因为该字符串进入了word[1]
占用的内存区域
现在如果你打印会发生什么?对printf
的第一次调用开始以a
开始打印,直到遇到\0
字符。这导致打印字符串abcdefghijklmnopqrstuvwxyz\n
,因为o
左后没有\0
字节。第二次调用printf
从word[1]
开始,从p
开始,直到看到\0
,导致打印pqrstuvwxyz\n
现在你怎么解决这个问题?请将数组中的每个字符串加长一个,或者让
fgets
只读取15
而不是16
个字符。我可以查看您的整个代码,包括打印word
数组时使用的代码吗?仅使用一部分代码是很困难的。好的,我将进行编辑。另外,您的语法不正确(char[10][15]word;
不是正确的C语法)。这段代码不会编译。请发布实际代码。我会立即尝试,但我在某个地方读到,为了容纳n个字符,必须设置为n+1?我可能读错了,我也编辑了那个部分。很抱歉,我将fgets改为fgets(单词[i],15,stdin),但现在它只接受14个字符。那么如何存储15个字符呢?编辑:哦,我明白了,谢谢