0

我有一个关于 C 编程中 fgets 的问题。

我在 do-while 中的代码(输入示例:A4 N)中使用 fgets() 函数。(以便输入正确)但由于某种原因,第一次就像 fgets() 不存在一样。

为了帮助您理解我,这是运行它后出现的内容。我也尝试使用 scanf() 但失败了..

Example of positioning: G3 E
Aircraft carrier (5 places), Give location and direction: 
1
Aircraft carrier (5 places), Give location and direction: 

我的代码是:

void arrayFill(char **array, int r, int c, int player)
{
char position[10];
printf("\n%s", "Example of positioning: G3 E");
do
{
    printf("\n%s", "Aircraft carrier (5 places), Give location and direction: ");
    fgets(position, 10, stdin);
    printf("\n%s", "1");
}while(validPosition(array, r, c, position, 5) == 2);
4

2 回答 2

2

这是混合面向场的输入(scanf()使用什么)和面向行的输入的一个非常常见的陷阱。面向字段的输入不太关心换行,当你使用类似的东西时

scanf("%d", &num);

然后你输入 "42\n" , "\n" 实际上是留在stdin. 您不会在后续scanf()调用中注意到它,因为(除了少数例外)scanf()将忽略前导空格。

当您fgets()一个接一个地scanf()打电话时,有一个'\n'left on stdin,并且fgets()很乐意为您接受这个“空行”。编写代码以在完成后忽略一行的其余部分很容易scanf()

int ch;
/* call to scanf() */
while ((ch = getchar()) != '\n' && ch != EOF) { /* do nothing */ }

完成此操作后,将不会有任何剩余的换行符。

于 2013-04-02T17:59:41.907 回答
0

问题可能与 '\n' 字符有关。这里还有另一个主题可以提供帮助。

于 2013-04-02T17:54:18.830 回答