gpt4 book ai didi

c - 当输入是 int 和 string 的混合时,scanf 读取两次

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:36 26 4
gpt4 key购买 nike

我正在尝试从标准输入中读取一个整数,然后一个字符一个字符地读取一个字符串:

#include <stdio.h>
int main(int argc, char const *argv[])
{
int T,N,i;
scanf("%d",&T);

while ( T-- )
{
scanf("%d",&N);
printf("N is %d\n",N );
char ch = getchar();

while ( (int)ch != '\n')
{
ch = getchar();
}

// printf("Outside.\n");
}
return 0;
}

我的输入是:

4
7
cookie milk milk cookie milk cookie milk
5
cookie cookie milk milk milk
4
milk milk milk milk
1
cookie

但是在运行时,我得到如下输出:

./COOMILK < input.txt
N is 7
N is 7
N is 5
N is 5

为什么它读取相同的值两次?

最佳答案

想想用户在做什么。他输入一个数字,然后呢?他点击进入!那是换行符,它被插入到标准输入缓冲区中,等待您的程序读取。

因此,当您尝试读取字符时,会获取之前存储的换行符,这会解释您所看到的行为。


无需转换 ch 来检查内部循环中的换行符。此外,内部循环作为 会更好循环。

getchar()返回一个 int,而不是一个 char,所以我会改变它,并考虑 EOF。在 I'm trying to understand getchar() != EOF 中阅读更多内容.

正如 Ed Heal 指出的那样,您可以利用 scanf() 的返回值以确保它已经读取了一个整数。

我会改变你的 对此:

int ch;
while ( T-- )
{
if(scanf("%d", &N) != 1) // read the integer and check the return value
{
printf("I was expecting to read an integer! Exiting...\n");
return 1;
}
ch = getchar(); // consume the newline
printf("N is %d\n",N );
do {
ch = getchar(); // read the string char by char
printf("%c", ch); // while printing every char
} while (ch != '\n' || ch == EOF); // until you see the newline
}

输出:

Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out < input.txt
N is 7
cookie milk milk cookie milk cookie milk
N is 5
cookie cookie milk milk milk
N is 4
milk milk milk milk
N is 1
cookie

关于c - 当输入是 int 和 string 的混合时,scanf 读取两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44094784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com