当我们读取字符或者字符串时,有时会遇到烦人的空白字符问题。因为结果很奇怪,为什么明明程序看起来没有错,但是结果读取到的值却是空的呢?下面我们来仔细分析一下。
创新互联建站主营临漳网站建设的网络公司,主营网站建设方案,重庆APP开发公司,临漳h5重庆小程序开发公司搭建,临漳网站营销推广欢迎临漳等地区企业咨询
在一个程序中连续读取多个变量时,如果最后一个是字符类型( 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 中包含一个非空白字符。
fread是用来读取文件的函数,其形式为
size_t fread ( void *buffer, size_t size, size_t count, FILE *file) ;
功能为从文件指针file中,每次读取size长度数据,读取count次,并将结果存到buffer中。
其出错的可能原因包括:
1 文件没有打开,或打开失败。即文件指针非法。当文件不存在,或用户对文件没有读权限,目标文件被占用等情况下,打开文件会失败,这时file指针值为NULL。
2 文件打开时,并没有指定读属性。
3 文件IO错误。如在文件打开后,文件被其它程序强制删除,或取消可读属性等。
4 文件达到文件尾。如果文件已经读到文件尾,不存在size*count字节的可读数据,fread会出错。
5 传入的buffer非法。如buffer为空,或buffer拥有的空间不足以存储size*count字节的数据,导致越界访问。
以上即为常见的fread读操作出错的原因。实际出错的时候,需要结合现象及代码综合分析才能得到准确的结果。
getch是一个计算机函数,在windows平台下从控制台无回显地取一个字符,在linux下是有回显的。用法是int getch(void)。
在linux平台下时(即包含的是curses.h),还应该在使用函数之前使用initscr(),使用完毕之后调用endwin().否则的话不需输入就会返回。Windows下不推荐使用POSIX。建议使用使用标准C++相似的名称:_getch。
扩展资料:
getch();并非标准C中的函数,不存在C语言中。所以在使用的时候要注意程序的可移植性。国内C语言新手常常使用getch();来暂停程序且不知道此函数来源,建议使用getchar()或者使用stdlib.h头文件中的system("PAUSE")调用系统命令暂停;(如果情况允许)代替此功能或更换一款编译器。
在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n);在使用之前要调用initscr(),结束时要调用endwin()。否则会出现不输入字符这个函数。
参考资料来源:
百度百科-getch
在输入语句之后加system("cls");这个语句可以清除屏幕之前的内容,也就是你输入完成之后屏幕上的输入数据就被清除了。。使用时要包含头文件stdlib.h
希望可以帮到你
可以使用getch()函数,不过这个不是标准库函数,会有移植的问题。
这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性!
#includestdio.h
#includestdlib.h
#includeconio.h
int main(void)
{
char ch;
while(1)
{
ch = getch();
if(ch == '\r')
{
break;
}
printf("*");
}
return 0;
}
可以看看百科的讲解,比我说的全面。