scanf()跟在fgets()或gets()或scanf()时的问题
scanf()函数是一个常见的C/ c++函数。尽管语法很基本,但重要的是要认识到在某些情况下使用它需要谨慎。一个例子是在scanf()之后调用fgets()。
在这篇文章中,我们将看看为什么fgets()在scanf()之后不起作用,以及可能的修复方法。首先,我们来看看scanf()和fgets()函数是如何执行的。
在C语言中,scanf()是一个库函数。它读取stdin作为标准输入。在C语言中,fgets()是一个库函数。它从提供的流中读取一行并将其保存在链接到的字符串变量中。只有满足下列条件之一时,它才会结束:
- 到达文件末尾
- 读取N-1个字符。
- 从换行符中读取字符。
下面的插图展示了如何使用scanf()函数:
C代码:
int main () {
char string[25];
printf("Enter name: ");
scanf("%s", string);
printf("Entered Name: %s\n", string);
return(0);
}
输入:
Box
输出:
Enter name: Box
Entered Name: Box
在C/C++中,fgets()函数
Fgets是Fgets()函数中file get string
的缩写。它基本上是一个从流(文件流或标准输入流)中读取最多n个字符,并将其转换为字符串str的函数。它的说法如下:
char* fgets(char* str, int n, FILE* stream);
让我们仔细看看这句话的每个细节。
- 必须读入字符串的字符数由int n表示。
- Stream是一个引用,指向包含要读取的输入的文件流。当从标准输入访问时,它被stdin取代。
- 这个函数的返回值是指向str的指针。
在scanf()问题之后使用fgets()
假设我们现在理解了fgets()和scanf()函数是如何操作的,让我们检查一下当我们紧跟在scanf()函数之后使用fgets()函数时会发生什么,以及在scanf()函数之后fgets()是否继续工作。
#include
int main(){
int a;
char str[45];
scanf("%d", &a);
fgets(str, 50, stdin);
printf("a = %d, str = %s", a, str);
return 0;
}
输入:
7
Box
输出:
7
a = 7, str =
Box
dash: 2: Box: not found
这里没有打印字符串”Box”。这是什么原因呢?scanf()函数的一个特定函数就是这个问题的原因。
除了从标准输入流中读取数据,scanf()函数还会向缓冲区中插入一个换行符。因此,上述代码中的scanf()函数在读取整数a后留下了一个换行符。读取完这个换行符后,fgets()函数结束了这个过程(记住我们讨论的fgets()操作完成读取输入的三个要求)。因此,fgets()方法忽略了字符串“Box”,并没有打印出来。
在使用scanf()时,一定要记住这一点。但是现在需要解决scanf()之后fgets()无法正常工作的问题。如何将字符串“Box”也打印出来?
问题的解决方案
既然已经研究了scanf()之后fgets()为什么会失败的问题,就可以推导出一个解决方案。请注意下面的代码。
C代码:
#include
int main(){
int a;
char string[45];
scanf("%d\n", &a);
fgets(string, 45, stdin);
printf("a = %d, string = %s", a, string);
return 0;
}
输入:
22
Box
输出:
a = 22, string = Box
- 有人注意到其中的区别吗?在scanf(“%dn”,&a)中,多了一个“n”。这迫使scanf()读取一个新行。此外,我们可以通过在scanf(“%d “, &a)中的单词“%d”后面添加一个空格来实现。
- 在scanf()方法之后,添加getchar()函数来读取额外的换行符。
- 因此,fgets()函数将读取输入字符串,而不是换行符。因此,scanf之后为什么fgets()失败的问题被解决了()。
- 我如何让Fgets在扫描后执行?
在scanf()中添加一个”n”,比如scanf(“%dn”, &x),或者在scanf()之后使用getchar(),都可以解决这个问题。
- 使用scanf()需要什么语法?
scanf()函数的语法如下:int scanf(const char *format,…);
- 为什么fgets在scanf之后不执行?
在scanf()中添加一个”n”,比如scanf(“%dn”, &x),或者在scanf()之后使用getchar(),都可以解决这个问题。在读取完这个换行符后,fgets()函数结束了操作。
- C语言中的Scanf返回什么?
Scanf给出了成功输入的总数,如果发生错误,则返回EoF (End of Line)。
- Fgets比Scanf更可取吗?
在做出选择之前,有几件事需要考虑。scanf()只能从标准输入中读取,而fgets()可以从任何文件流中读取。
- 使用fgets()需要什么语法?
使用fgets()看起来像这样:char* fgets(char* str, int n, FILE* stream);
总结
如果scanf()函数在fgets()方法之前使用,则会出现一个非常常见的问题。由于这个问题,由于scanf()方法在缓冲区中留下了一个换行符,所以fgets()函数无法读取一些输入。在scanf()中添加一个“n”,比如scanf("%dn", &x)
,或者在scanf()之后使用getchar()都可以解决这个问题。