我的程序可以接受任意长度或空输入。但是,如果输入为空(空格或换行符),程序将继续等待输入。我也尝试了fgets
但是如果按下空格/换行符,它仍然会在关闭之前等待更多不是空格/换行符的输入。
简化代码:
#include <stdio.h>
main()
{
int num;
scanf("%i",&num);
printf("%i",num);
}
输入:
363792
输出:
363792
渴望:
输入:
输出:
我是 C 的新手,我很难完成这项工作。
尝试使用fgets:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
int n;
char s[20];
fgets(s,20,stdin);
n = atoi(s);
printf("%i",n);
}
编辑:原来我没有正确编译代码。因此每次我尝试进行更改时,只需使用scanf查看原始代码。
答案 0 :(得分:22)
我也尝试了fgets但是如果按下空格/换行符,它仍然会在关闭之前等待更多不是空格/换行符的输入。
首先fgets
将适用于此案例。如果您向我们展示了您使用fgets()
确切尝试做什么,那么对此问题的回答将会非常狭隘或非常具体。
我尝试使用fgets()
执行相同操作,以下是代码段。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char string[100];
printf("Enter a number: ");
fgets (string, 100, stdin);
/* Here remove the trailing new line char; not required unless you are trying to print the string */
string[strlen(string) - 1] = '\0';
printf("Num is %d\n", atoi(string));
return 0;
}
如果没有输入或只输入或空格并输入,则打印的数字将为零,fgets()将不会等到您输入有效数字。
另请查看不应使用获取的原因。 Do not use gets()
答案 1 :(得分:9)
根据scanf()
的定义该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符。
因此,您无法使用scanf()
获得所需的结果。
由于获取()不安全而且行为不当。如果您需要使用atoi()
,可以使用fgets()获取输入并将其转换为整数。
您可以尝试以下示例代码:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
int num;
char ch[100];
fgets(ch, sizeof ch, stdin);
if (strlen(ch)>1&& ch[strlen(ch)-1] == '\n')
{
ch[strlen(ch)-1] = '\0';
num = atoi(ch);
printf("%i\n", num);
}
}
答案 2 :(得分:6)
您应该逐个读取输入字符,如果读取的字符不是数字,则停止读取:
char ch;
while(1)
{
ch=getchar();
if(isdigit(ch))
{
putchar(ch);
}
else
{
break;
}
}
答案 3 :(得分:2)
好吧,你不明白scanf()的作用,它会扫描整个输入字符串并查找特殊字符,如%d,%f,%s,直到它没有得到它将等待的字符串。
scanf("%d %d", a, b);
只有在输入2个整数值时才会完成,如果你按空格它不算作整数值,所以它会忽略它。