字符串输入
1.分配空间
假如你身边出现了这样的情况
char *name;
scanf("%s",name);
这样的代码可能会通过编译,但是在读入name的时候,name可能会擦写掉程序中的数据,这是因为该参数是一个未初始化的指针,name可能会指向任何地方。
大多数程序员都会认为出现这种情况很搞笑,但这仅限于评价别人的程序时。
最简单的方法是,在声明的时候指明数组的大小
char name[81];
2.可怜的gets()函数
说起读取字符串,很多人都会想到scanf("%s",&sssss);但是%s仅仅能读取一个单词。当面临一整句的输入时,这样的方法显然是不可行的.
gets()函数就用于处理这种情况。gets()函数简单易用,他读取整行输入,直到遇到换行符,但后丢弃换行符,存储其余字符,并在这些字符的末尾添加一个空字符让它成为一个C字符串。通常和puts()函数配对使用。
#include "stdio.h"
int main(){
char words[100];
puts("enter a string, please");
gets(words); //典型用法
printf("your string twice:\n");
printf("%s\n",words);
puts(words);
return 0;
}
输出结果如下
gets()函数存在的问题:
如果上述words数组的大小不是100,而是5怎么办,由于gets()函数唯一的参数时words,他无法检查数组是否装的下输入行。如果输入的字符串过长会导致缓冲区溢出。
因此C编程社区的许多人都在建议在编程时摒弃gets()。制定C99标准的委员会也把这些建议放入了标准,承认了gets()的问题并建议不要用他。但是我认为,只要使用得当,尽量避免这些溢出问题,它的确是一个很方便的函数,你觉得呢?
3.gets()的替代品
①fgets()!!!
简单介绍一下fgets()函数与gets()函数的区别;
- fgets()函数的第二个参数指明了读入字符的最大数量。
- 如果fgets()读到一个换行符,会把它储存在字符串中。
- fgets()函数的第三个参数指明要读入的文件,值得注意的是,如果读入从键盘输入的数据,则以stdin(标准输入)作为参数,该标识定义在stdio.h中
#include "stdio.h"
int main(){
char words[50];
puts("enter a string, please");
fgets(words,50,stdin);
puts(words);
return 520;
}
输出结果如下:
fputs()的应用
#include "stdio.h"
int main(){
char words[10];
puts("enter a string, please");
while(fgets(words,10,stdin)!=NULL && words[0] !='\n')
fputs(words,stdout);
puts("done");
return 520;
}
另外插入一个小的概念,供大家体会空字符和空指针的区别
②gets_s()函数!!!!
gets_s()函数与fgets()的区别如下
- gets_s()只从标准输入中读取数据,所以不需要第三个参数
- 如果gets_s()读到换行符,会丢弃它而不是存储它.
- 如果gets_s()函数读到最大字符数都没有读到换行符,会执行以下几步。
1)首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或者文件结尾,然后返回空指针。
2)调用依赖实现的“处理函数”,可能会终止或退出程序。
到这里,大家有没有对字符串的输入有一个清晰的认识呢,也欢迎大家前来补充!!