C语言字符串的读取
为什么要使用fgets()函数?
在C语言,常用的同类函数还有fscan()和gets(),不过这两种函数都有其缺点,或 者可以说是制约性。
fscan()函数不能读取带有空格的字符串,当字符串中含有空格时,函数只能读取 空格之前的字符串,空格之后的全部忽略。
gets()函数虽然可以操做带有空格的字符串,不过容易引起溢出,因为C语言是将 字符串当做一种数组操做的,既然是数组,就有长度,如果gets ()函数读取的字 符串长度大于被赋值数组的长度,就会引起溢出,而且新版的GCC已经不能正确编 译gets()函数了,会报错。
fgets()函数的基本用法为: fgets(char * s,int size,FILE * stream);
括号中,第一个参数为将被赋值的数组名,这里需要注意的是,其中不用写数组名 称后面的方括号以及其中的数组长度。 第二个参数是将要读取字符串的长度,这里需要注意的是,这里长度的数值是“字 符串实际长度+1”,加1是因为,字符串最后面还有一个/0位。 最后一个参数为输入设备或者变量。一般情况下,我们都是从键盘输入,也就是 stdin。(从文件读取的这里暂不说明)
OK!现在举一个例子!下面的这段代码作用在于,属于一个字符串,然后计算出字 符串中单词的个数。
#include<stdio.h>
#include<string.h>
main()
{
char dia[80];
char t,m;
int i=0,num=0,flag=0;
fgets(dia,80,stdin);
fputs(dia,stdout);
for (i=0;dia[i]!='/0';i++)
{
if (dia[i]==' ')
flag=0;
else
if (flag==0)
{
flag=1;
num++;
}
}
printf("%d/n",num);
return 0;
}
这段代码的工作原理是,使用一个用于标示的变量flag,还有一个用于统计单词个 数的变量num。然后逐一读取字符串中的每一个字符,当遇到字母时flag的值为1, 当遇到空格时,flag的值为0。如果遇到一个字母,并且此时flag值为0(说明这个 字母之前的一个字符是空格),给num加1,直到遇到空格时,将flag重新赋值为 0。 在fgets()使用中需要注意,其中第二个参数规定的字符串长度应该与字符串长度 相等,否则运行程序时会有溢出的错误。当输入的字符串大于限定的字符串长度时 (本例中限定的是80),限定长度之后的字符串会被丢弃。
strstr
原型:extern char *strstr(char *haystack, char *needle); 用法:#include <string.h> 功能:从字符串haystack中寻找needle第一次出现的位置(不比较结束符NULL)。 说明:返回指向第一次出现needle位置的指针,如果没找到则返回NULL。 举例: // strstr.c #include <syslib.h> #include <string.h> main() { char *s="Golden Global View"; char *l="lob"; char *p; clrscr(); p=strstr(s,l); if(p) printf("%s",p); else printf("Not Found!"); getchar(); return 0; } |