一个简单的C问题,我想从标准输入(用户输入)读取整数,标准输入的每一行都包含一个整数,而空行则表示输入的末尾。 我尝试使用gets()和scanf(),但无法正常工作。
while (1){
char a;
scanf("%c",&a);
printf("%c",a);
if (a=='\r'||a=='\n'){
break;
}
}
当我使用scanf()时,它在每次按Enter键时终止;
while(1){
char a[10];
gets(a);
if (a=='\r'||a=='\n'){
break;
}
}
当我使用gets()时,无法将'\ r'或'\ n'读入缓冲区,因此它永远不会中断。
有人可以帮我吗,谢谢!
答案 0 :(得分:4)
这是XY problem?吗?您可以使用fgets
和sscanf
来完成这项工作。
#include <stdio.h>
int main(void) {
char buffer[100];
int number;
while(fgets(buffer, sizeof buffer, stdin) != NULL) {
if(sscanf(buffer, "%d", &number) != 1) { // or strtol perhaps
break;
}
printf("Number: %d\n", number);
}
return 0;
}
答案 1 :(得分:2)
我想从标准输入中读取整数
做
while (1){ char a; scanf("%c",&a); printf("%c",a); if (a=='\r'||a=='\n'){ break; } }
您读了一行包含任何字符的行,不仅是数字表示形式
做
while(1){ char a[10]; gets(a); if (a=='\r'||a=='\n'){ break; } }
a 是char*
,因此在a=='\r'||a=='\n'
中错误地将指针与字符进行比较,您想要*a=='\r'||*a=='\n'
其他说明:
fgets(a, sizeof(a), stdin)
我想从标准输入(用户输入)中读取整数,标准输入的每一行都包含一个整数,空行表示输入的结尾。
提案,在行尾之前仅包含空格和制表符的行被认为是空的,并且绕过该数字之前/之后的空格和制表符而不会被视为无效:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
int main()
{
while(1) {
puts("enter number");
char a[10];
if (fgets(a, sizeof(a), stdin) == NULL) {
puts("EOF");
break;
}
errno = 0;
char * endptr;
long n = strtol(a, &endptr, 10);
if (errno != 0) {
puts("not a valid long");
}
else {
/* check possible unexpected characters */
char * p = endptr;
for (;;) {
if (*p == 0) {
if (endptr == a) {
puts("done");
return 0;
}
printf("the number is %ld\n", n);
break;
}
if (!isspace(*p++)) {
puts("not (only) a valid long");
break;
}
}
}
}
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra n.c
pi@raspberrypi:/tmp $ ./a.out
enter number
123
the number is 123
enter number
123
the number is 123
enter number
12a
not (only) a valid long
enter number
a12
not (only) a valid long
enter number
a
not (only) a valid long
enter number
done
答案 2 :(得分:0)
我认为使用getline可能是一个更通用的解决方案,下面是一些示例代码,您可以根据需要对其进行修改,“ buf”将包含输入内容。
kitkat-release