C语言中(字符串)输入scanf()、gets()、fgets()以及getchar()函数的联系与区别

时间:2021-12-16 01:47:51

scanf()函数的输入基于获取“单词”,如果使用%s格式,字符串以第一个非空白字符开始读入,读到(但不包括)下一个空白字符(可以是空格、制表符或者换行符)。使用scanf()把一个字符串读进一个字符数组时,不使用&。scanf()函数返回成功读入项目的个数,若没有任何合乎要求的项目读入,scanf()返回0,当它检测到文件结尾时,返回EOF(#define指令把EOF的值定义为-1)。

使用格式:

char str[20];
scanf("%s",str);

gets()函数输入基于获取“字符串”,从字符串的第一个字符开始读入,读到第一个“\n”(换行字符)字符。即,读取换行符之前(不包括换行符)的所有字符,在这些字符后添加一个空字符(\0),然后把这个字符串读进一个字符数组。它将读取换行符并将其丢弃,这样下一次读取从新的一行开始。gets()函数返回一个指向char的指针,返回的指针与传递给它的是同一指针。gets()函数实际的构造比较复杂,因为它有两个可能的返回值。如果读入顺利,返回读入字符串的地址;如果出错或者gets()函数遇到文件结尾,它就返回一个空(或0)地址,这个空地址即空指针,用stdio.h中的常量NULL来表示。

由于gets()不检查目标数组是否能容纳输入,所以很不安全。

使用格式:

char str[20];
char *ptr;
ptr = gets(str);

gets()函数构造:

char *gets(char *s){
……
return(s);
}

fgets()函数与gets()不同在于它需要第二个参数来说明最大读入数,参数为n,则fgets()就会读取最多n-1个字符或者读完一个换行符为止,两者最先满足要求的那一个来结束读入。fgets()读取到换行符,就会把它存到字符串里,而不是像gets()那样丢弃它。它由第三个参数来说明读哪一个文件,stdin代表从键盘读入。

使用格式:

char *str;
char *ptr;
ptr = fgets(str,20,stdin);

getchar()函数没有参数,它返回来自输入设备的下一个字符,putchar()打印它的参数。这两个函数通常在stdio.h中定义,通常是预处理宏,而非真正的函数。可以利用循环将字符依次读入到字符串数组,getchar()可以接收换行符,因此需要在循环读入的过程中消除换行字符。

char s[20];
int n=0;
while(1){
s[n]=getchar();   // 读入1个字符
if (s[n]=='\n') 
break;  // 如果是换行符,则结束循环;相当于清除缓存中输入确定的换行符
n++;
}