C语言中用scanf()和fscanf()读取空格

Python021

C语言中用scanf()和fscanf()读取空格,第1张

scanf和fscanf函数是不能读空格和回车符的,在读取的时候会自动过滤掉这些分隔符。

要想读空格,必须用gets函数,在string.h中有定义,需要实现include它。

gets的用法:

char

a[10]

gets(a)

c++下也可以用getline函数,不过建议VC用户不要用,因为微软的C++编译器有个经典的getline

bug.在缓冲的时候会多缓冲一行。

当我们读取字符或者字符串时,有时会遇到烦人的空白字符问题。因为结果很奇怪,为什么明明程序看起来没有错,但是结果读取到的值却是空的呢?下面我们来仔细分析一下。

在一个程序中连续读取多个变量时,如果最后一个是字符类型( char )的话,那么你一定要注意。

scanf() 倾向于遗留下它“扫视”过但未读取的字符(包括换行符)。比如下面的程序:

在读入i的同时,scanf函数调用将会留下没有消耗掉的任意字符,包括(但不限于)换行符。 getchar() 或者 scanf("%c", ...) 将在随后取回第一个剩余字符,但这不是我们所希望的结果。

上述问题的解决方法之一就是可以在读取字符之前,先确保前面没有换行符。

上面的方法只是针对换行符,但是如果是其他空白字符的话,就有些麻烦了。在C标准库中有一个函数可以用来检测空白字符,我们需要包含头文件 ctype.h 。

假如我们要读取一行字符串,很多人都会采取类似于下面的方法:

NOTE: 注意这里 ch 以及前面的 command 变量都为 int 类型,原因是 getchar() 函数实际上返回的是 int 类型,之所以这样设计是为了适应 EOF 这个特殊值。当这些函数读取出错或者读完文件后,会返回 EOF 。 EOF 是一个宏,标准规定它的值必须是一个 int 型的负数常量。

上述方法看似没有任何问题,而且确实是没有问题。但是在某些情况下,上面的函数就会出现问题。假如在读入字符串之前,我先读入了某个变量并按下回车符或者其他空白字符,这时使用上面方法将什么也读不到或者读到的值开头将是空白字符。

原因很简单, read_line() 函数中 while 循环结束的条件是读到换行符,如果前一次读取遗留下某些空白字符就会影响到后面的 read_line() 读取。

解决的方法很简单,下面是新的 read_line() 函数:

我们同样使用了问题一中的 isspace() 函数。表达式 isspace(ch = getchar()) 控制第一个字符,把读入的字符存储在 ch 中,然后使用 isspace() 函数判断 ch 是否是空白字符。如果不是,循环终止, ch 中包含一个非空白字符。

C语言中,可以用gets函数来接收输入的字符串(包含空格)。

格式:gets(字符数组名)

功能:gets函数用于将输入的字符串内容存放到指定的字符数组中,输入结尾的换行符'\n'被换成'\0'存储在该数组中。

举例说明如下:

char str[20]  // 定义一个字符数组,大小为20个字节

gets(str)     // 将用户输入的字符串(可以包含空格)存储到字符数组str中,以回车结束输入

printf("%s", str)  // 输出用户输入的字符串(包含空格)

注:使用gets函数时,需将头文件#include<stdio.h>包含到源文件中。