您当前的位置:首页 > 互联网教程

C语言空白字符读取问题

发布时间:2025-05-19 01:44:28    发布人:远客网络

C语言空白字符读取问题

一、C语言空白字符读取问题

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

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

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

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

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

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

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

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

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

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

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

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

二、c语言中分隔符有哪些

1、c语言中,分隔符有逗号、空白符、分号和冒号。

2、(1)逗号作为分隔符用来分隔多个变量和函数参数;

3、(2)空白符常用来作为多个单词间的分隔符,也可以作为输数据时自然输入项的缺省分隔符;

4、(3)分号常用于for循环语中for后面,圆括号内的三个表达式之间;

5、(4)冒号用于语句标号与语句之间。

6、charstr[]="now,isthetimeforall,goodmentocometothe,aidoftheircountry";

7、printf("resultis\"%s\"\n",result);

8、参考资料来源:百度百科—分隔符

三、c语言中的续行符怎么用啊

1、把一个预处理指示写成多行要用“\”续行,因为根据定义,一条预处理指示只能由一个逻辑代码行组成。

2、而把C代码写成多行则不必使用续行符,因为换行在C代码中只不过是一种空白字符,在做语法解析时所有空白字符都被丢弃了。

3、宏定义规定,宏定义必须在一行里完成。所以用#define定义宏定义时,有时为了阅读方便,就加续行符"\"来换行。在普通代码行后面加不加都一样(VC是自动判断续行的)。

4、#define SomeFun(x, a, b) if(x)x=a+b;else x=a-b;

5、这一行定义是没有问题的,但是这样代码很不容易被理解,以后维护起来麻烦,如果写成:

6、这样理解是好理解了,但是编译器会出错,因为它会认为#define SomeFun(x, a, b)是完整的一行,if(x)以及后面的语句与#define SomeFun(x, a, b)没有关系。这时候我们就必须使用这样的写法:

7、 VC的预处理器在编译之前会自动将"/"与换行回车去掉,这样一来既不影响阅读,又不影响逻辑。