1.gets函数

从键盘获得字符串,读字符串直到遇到换行字符,自动添加空字符

它读取换行符并丢弃

形参是字符串地址,返回值也是字符串地址 char * gets(char * ),返回的指针域传递给它的指针是同一个指针。输入的字符串只有一个备份,它放在作为函数参数传递过来的地址中

如果出错或遇到文件尾,gets返回空地址NULL(NULL是一个指针,空指针)我们可以使用while(gets(name) != NULL)来检查

不检查溢出问题,多出来的字符溢出到相邻内存区

 

  1. #include<stdio.h> 
  2. #define MAX 81 
  3.  
  4. int main(void){ 
  5.     char name[MAX]; 
  6.     char *ptr; 
  7.  
  8.     ptr = gets(name); 
  9.     printf("%s,%p\n",name,name);//ptr和name存储的地址内容都是相同的,说明指向同一个位置,没有复制字符串 
  10.     printf("%s,%p\n",ptr,ptr); 
  11.  
  12.     return 0; 
  13.  
  14. }  

 2.fgets函数

第二个参数说明最大读入字符数,fgets在读取n-1个字符或读到换行符为止,最先满足的来结束输入。

fgets读取换行符,并留在字符串中,不像gets那样丢弃

第三个参数说明读哪个文件,从键盘上读使用stdin

 

  1. #include<stdio.h> 
  2. #define MAX 81 
  3.  
  4. int main(void){ 
  5.     char name[MAX]; 
  6.     char *ptr; 
  7.  
  8.     ptr = fgets(name,MAX,stdin); 
  9.     printf("%s,%p\n",name,name);//结果会显示换行符! 
  10.     printf("%s,%p\n",ptr,ptr); 
  11.  
  12.     return 0; 
  13.  
  14. }  

3.scanf函数

倾向于读取一个单词而不是一个字符串

遇到第一个非空白字符开始读取,遇到下一个空白字符结束,不会丢弃空白字符,而是将它们留在流中

可以指定读取的字符数,但是也无法越过空白字符,两者最先满足的终止输入

 

  1. #include<stdio.h> 
  2. #define MAX 81 
  3.  
  4. int main(void){ 
  5.    char name1[11],name2[11]; 
  6.    int count; 
  7.  
  8.    printf("Enter 2 names.\n"); 
  9.    count = scanf("%5s %10s",name1,name2); 
  10.    printf("I read the %d names %s and %s.\n",count,name1,name2); 
  11.  
  12.    return 0; 
  13.  
  14. }