我有两个问题:
scanf("%d ", &num);
它有效吗?我在scnaf和gets之间尝试fflush(stdin) \ _flushall()
并且它不起作用,它会跳过获取。
void main() { char ch, str[10]; int num; printf("Enter your number : "); scanf("%d ", &num); printf("%d\n",num); gets(str); puts(str); system("pause"); }
答案 0 :(得分:3)
C FAQ涵盖scanf
的所有这些问题。请参阅Why does everyone say not to use scanf? What should I use instead?及相关条目。通常,您会使用fgets
,然后处理生成的行,例如使用sscanf
并检查sscanf
是否成功。这样可以避免留下未解析的输入并冒无限循环的风险。
int number;
char line[255];
fgets( line, sizeof(line), stdin );
if( sscanf( line, "%d", &number ) != 1 ) {
fputs("That doesn't look like a number.\n", stdin);
}
请注意,fgets
会读取换行符或缓冲区可以容纳。如果该行大于您的缓冲区,则它可能只读取该行的一部分。接下来从输入读取将获得该行的其余部分。有避免这种情况的方法,例如the POSIX getline function,但至少你不会陷入无限循环。
让我们解读一些评论。
gets
。使用fgets
。您不使用gets
的原因是因为无法限制从stdin
读取的内容。这意味着用户可以溢出缓冲区,造成破坏。
char buffer[32];
// What the line is more than 31 characters?
gets(buffer);
fgets()
占用缓冲区的大小,最多会读取多个字符。这可以防止缓冲区溢出。
char buffer[32];
// If there's more than 31 characters it will stop reading.
// The next read of stdin will get the rest of the line.
fgets( buffer, sizeof(buffer), stdin );
gets()
功能。" 是的, 是C中的gets()
函数。
是的,不是 C中的gets()
函数。
这取决于你在说什么C.
有些人说'C"意味着C11,现行标准。其他人说'" C"意味着C99以前的标准。有些人仍坚持原标准C90。 C90中有一个gets()
函数。它在C99中已弃用。它已从C11中的语言中删除。
C编译器和文档落后于标准,非常非常远。许多人仍在全力支持C99。如果你为C11工作,你会因为缺乏支持而感到非常惊讶。如果您希望代码适用于大多数编译器,请写入C99。
无论如何,请勿使用gets
。
答案 1 :(得分:2)
在
- 为什么只有当我在“%d”中做空格时 - > scanf(“%d”,& num);它有效吗?
醇>
scanf("%d", &num);
之后没有空格的 "%d"
,在读取数字后停止扫描。因此,输入 1 2 3 输入,'\n'
保留在stdin
中下一个输入函数,如现在的非标准gets()
。 gets()
读取单个'\n'
并返回。通过添加空格,scanf("%d ", &num);
会消耗数字后面的空格,并且在数字后面输入非白色景观后才会返回。
- 当我做空间时,它首先执行scanf然后获取,然后打印数字并打印字符串。
醇>
通过添加空格,scanf("%d ", &num);
不会返回,直到在数字后面输入非空格(如下面的'a'
中所示)。由于stdin
通常是行缓冲的,这意味着需要首先输入2行。 1 2 3 输入 a b C 输入
建议改为使用fgets()
来阅读用户输入的行。
char str[10*2]; // no need for such a small buffer
int num;
printf("Enter your number : ");
fflush(stdout);
fgets(str, sizeof str, stdin);
sscanf(str, "%d", &num);
printf("%d\n",num);
printf("Enter data : ");
fflush(stdout);
fgets(str, sizeof str, stdin);
fputs(str, stdout);
更强大的代码会检查fgets(), sscanf()
的结果并使用strtol()
而不是sscanf()
。