scanf()跟在fgets()或gets()或scanf()时的问题

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()失败的问题被解决了()。
  1. 我如何让Fgets在扫描后执行?

在scanf()中添加一个”n”,比如scanf(“%dn”, &x),或者在scanf()之后使用getchar(),都可以解决这个问题。

  1. 使用scanf()需要什么语法?

scanf()函数的语法如下:int scanf(const char *format,…);

  1. 为什么fgets在scanf之后不执行?

在scanf()中添加一个”n”,比如scanf(“%dn”, &x),或者在scanf()之后使用getchar(),都可以解决这个问题。在读取完这个换行符后,fgets()函数结束了操作。

  1. C语言中的Scanf返回什么?

Scanf给出了成功输入的总数,如果发生错误,则返回EoF (End of Line)。

  1. Fgets比Scanf更可取吗?

在做出选择之前,有几件事需要考虑。scanf()只能从标准输入中读取,而fgets()可以从任何文件流中读取。

  1. 使用fgets()需要什么语法?

使用fgets()看起来像这样:char* fgets(char* str, int n, FILE* stream);

总结

如果scanf()函数在fgets()方法之前使用,则会出现一个非常常见的问题。由于这个问题,由于scanf()方法在缓冲区中留下了一个换行符,所以fgets()函数无法读取一些输入。在scanf()中添加一个“n”,比如scanf("%dn", &x),或者在scanf()之后使用getchar()都可以解决这个问题。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程