在程序中,字符串是使用频率很大的一种字符数据,但是初学者往往对这一块搞得不是很清楚,在此给大家分享一下有关字符串输入在使用过程中常见的问题以及解决的办法。
首先我们得知道什么是字符串?字符串是以字符'\0'结尾的字符序列。
我们怎么读取字符串呢,c库提供了三个读取字符串的函数:scanf(),gets(),fgets()。
scanf()是格式化输入,如果要输入字符串,使用%s格式,字符串是以遇到的第一个非空白字符开始,遇到(但不包括)下一个空白字符(比如空格、制表符或换行符)结束。如果指定了字段宽度,比如%10s, scanf()就会读入10个字符或直到遇到第一个空白字符,由二者中最先满足的那一个终止输入.在这里最常见的问题是我们要输入的字符串中含有空白字符,继续使用scanf(),得到的就不是我们想要的结果,比如件下面的例子
int main(int argc, const char * argv[]) {
char str[256];
printf("请输入一英文句子\n");
scanf("%s",str);//scanf 遇到空格就结束
printf("%s",str);
return 0;
}
输入的是
I have a dream.
输出的结果为
I
结果只输出I,为什么从I出现空格后就没有输出,这是因为scanf()遇到空格就结束,scanf()是基于获取单词而不是获取字符串。我们怎么解决这个问题?一我们可以用库函数提供的另一个函数gets();
gets()是我们最常用的,读取字符串直到遇到一个换行字符('\n') ,它能读取换行符之前(不包括换行符)的所有字符,在这些字符后添加一个空字符('\0') ,然后把这个字符串交给调用它的程序.但是gets()的一个不足就是它不检查预留存储区是否能够容纳实际输入的数据,多出来的字符简单地溢出到相邻的内存区,所以好多不知道这点的初学者容易写出下面的程序:
int main(int argc, const char * argv[]) {
char arr1[10] = "abfjgk";
char arr[10];
scanf("%s",arr);
printf("->\n");
printf("%s\n",arr);
printf("%s\n",arr1);
return 0;
}
当输入
1234567890123
输出结果为:
->
1234567890123
123
由上面的程序可以看出gets()函数很不安全,一旦用户输入的数据超出了存储区预留的大小,程序就会出现问题,针对这个问题我们可以自定义一个函数,可以指定最大读入的字符数
void getString(char arr[],int len){//len 指定最大输入的字符数
int i = 0;
//条件满足读入的字符不是换行符并且输入的字符数小于指定的最大字符数,继续读入字符;
while((arr[i] = getchar())!= '\0' && len > i+1){
i++;
}
//循环结束后最后添加字符串结束符‘\0’;
arr[i] = '\0';
}
我们也可以使用fgets()函数,fgets()的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:fgets(字符数组名,n,文件指针);
其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中 。