目录
一、输入输出的几种函数的选用
1.gets(),puts()
gets():
读取整行输入,直至遇到换行符,丢弃换行符,储存其余字符,并在末尾添加空字符。
但是它无法检查数组是否装得下字符串,如果字符串过长,会导致缓冲区溢出,有可能擦写掉程序中的其他数据,导致程序异常终止;
在C11标准中废除了此函数。
puts():
参数:字符串的地址。
遇到空字符就停止输出。
一个例子,gets()读到文件结尾会返回空指针。对空指针求值为0便可结束循环:
while(gets(line))
puts(line);
2.fgets(),fputs()
fgets(word,stlen,stdin)
参数2:读入字符的最大数量,可读入stlen-1个字符,或读到遇到的第一个换行符为止。
参数3:要读入的文件,如果读入从键盘输入的数据,以stdin作为参数。
fgets()把换行符放在字符串的末尾,通常与fputs()配对使用。
fputs(word,stdout)
参数2:要写入的文件,如果要显示在计算机显示器上,以stdout作为参数。
与puts()的区别:puts()会在末尾添加换行符,而fputs()不会。
fgets()返回指向char的指针,返回的地址与传入的第一个参数相同,如果读到文件结尾,则返回NULL。
将换行符替换成空字符:
while(word[i] != '\n')
i++;
word[i] = '\0';
清空留在输入行的字符串:
while(getchar() != '\n')
continue;
3.gets_s()
gets_s()与fgets()的区别:
- gets_s()读到换行符不会储存它
- 不需要第三个参数
- 若读到最大字符数都没有读到换行符,会先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直到读到换行符或文件结尾,然后返回空指针。接着调用依赖实现的处理函数,可能会终止或退出程序。
4.s_gets()
用来替换gets(),作为fgets()的补充,但错误输入时无反应。
char *s_gets(char *st,int n)
{
char *ret_val;
int i = 0;
ret_val = fgets(st, n, stdin);
if(ret_val)
{
while(st[i] != '\n' && st[i] != '\0')
i++;
if(st[i] == '\n')
st[i] = '\0';
else
while(getchar() != '\n')
continue;
}
return ret_val;
}
5.scanf(),printf()
对于输入结束:
- %s:以下一个空白字符(空行、空格、制表符、换行符)作为字符串的结束;
- %10s:读取10个字符或读到第一个空白字符后结束。
第二次调用scanf()时,从上一次调用结束的地方继续读取数据。
二、字符串函数
string.h
1.strlen()
用于统计字符串的长度。
一个例子,用于缩短字符串的长度:
void fit(char *string, unsigned int size)
{
if(strlen(string) < size)
string[size] = '\0';
}
但上述后面的字符仍在缓冲区内,可用puts(string + n)把n位之后的字符串打印出来。
2.strcat()和strncat()
用于拼接字符串。
strcat()接受两个字符串作为参数,把第二个字符串的备份附加在第一个字符串的末尾,并把拼接后形成的新字符串作为第一个字符串,第二个字符串不变。
strcat()的类型是char *,函数返回第1个参数,即拼接后的新字符串地址。
如果第一个数组的空间不够容纳第二个字符串,会造成内存溢出,所以需要使用strncat()的第3个参数来指定最大添加字符数.例如
strncat(str1,str2,n);
这样在加到第n个字符或遇到空字符时停止。
n变量的值可通过以下计算:
char str1[str1size];
s_gets(str1, str1size);
n = str1size - strlen(str1) - 1;
strncat(str1, str2, n);
puts(str1);
注意:要给拼接后的字符串长度加1才够空间存放末尾的空字符
3.strcmp()和strncmp()
用来比较两个字符串的内容,如果参数相同返回0,否则返回非零值。
如果在字母表中第1个字符串位于第2个字符串前面,返回负数,反之返回正数;
因为在ASCII中,大写字母在小写字母前面,所以(‘大写’,‘小写’)返回的是负值。
空字符在ASCII中排第一,任一字符一定在它后面,对于ASCII值,若(str1,str2)中str1的值更靠后,则返回正数,反之返回负数。
而strncmp()在比较时,可以只比较第3个参数指定的字符数。
4.strcpy()和strncpy()
用来拷贝整个字符串,相当于字符串赋值运算符。
strcpy()第2个参数指向的字符串被拷贝至第1个参数指向的数组中,拷贝出来的字符串被称为“目标字符串”,最初的字符串被称为“源字符串”。
拷贝时需要确保目标数组有足够的空间容纳源字符串的副本。
注:声明数组将分配储存数据的空间,而声明指针只分配储存一个地址的空间。
由于参数为字符串指针,故可用来拷贝数组的一部分。
注:strcpy()会把源字符串中的空字符也拷贝在内,并覆盖掉数组中对应位置的值。
strncpy()函数的第三个参数指明可拷贝的最大字符数。
一般把此参数设置为比目标数组大小少1,然后把数组最后一个元素设置为空字符,以确保储存的是一个字符串。
strncpy(qwords[i], temp, TARGSIZE - 1);
qwords[i][TARGSIZE - 1] = '\0';
5.sprintf()
此函数声明在stdio.h中,和printf()类似,但它是把数据写入字符串,而不是打印在显示器上,因此该函数可以把多个元素组合成一个字符串。sprintf()第一个参数是目标字符串的地址,其余和printf()相同。
sprintf(formal, "%s, %-19s: $%6.2f\n", last, first, prize);
6.strchr(),strpbrk(),strrchr(),strstr()
char *strchr(const char * s, int c);
char *strpbrk(const char * s1, const char * s2);
char *strrchr(const char * s, int c);
char *strstr(const char * s1, const char * s2);
strchr():
如果s字符串中包含c字符,该函数返回指向s字符串首次出现的c字符的指针,若未找到c字符,则返回空指针。
strpbrk():
如果s1字符中包含s2字符串中的任意字符,该函数返回指向s1字符串首位置的指针;如果在s1字符串中未找到任何s2字符串中的字符,则返回空字符。
strrchr():
该函数返回s字符串中c字符的最后一次出现的位置(包括末尾的空字符),若未找到则返回空指针。
strstr():
该函数返回指向s1字符串中s2字符串出现的首位置。如果在s1中没有找到s2,则返回空指针。
例子,代替以上s_gets()函数:
char line[80];
char * find;
fgets(line, 80, stdin);
find = strchr(line, '\n');
if(find)
*find = '\0';
(参考:C Primer Plus)