c语言中使用sscanf函数读读空数据的问题

Python031

c语言中使用sscanf函数读读空数据的问题,第1张

别费脑筋了,另想办法吧!两个逗号间本无数据,你怎么能叫sscanf读出个“空”来——这真叫“无中生有”!给你个思路:写个函数一个数据一个数据读,当遇到两个或多个连续逗号时在两个逗号间给接收变量附加一个“空”。

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

在一个程序中连续读取多个变量时,如果最后一个是字符类型( 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 中包含一个非空白字符。