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个字符呢?编辑:哦,我明白了,谢谢