一、字符串处理函数
1、puts(字符数组)
其作用是将一个字符串(以'\0'结束的字符序列)输出到终端。假如已定义str是一个字符串数组名,且该数组已被初始化为“China”,则执行
puts(str);
那么终端将显示"China"字符串。由于可以用printf函数输出字符串,因此puts函数用的不多
注:用puts函数输出的字符串中可以包含转义字符,例如
#include "stdafx.h"
#include <Strsafe.h>
int _tmain(int argc, _TCHAR* argv[])
{
char str[]={"China\nBei jing"};
puts(str);
getchar();
return 0;
}
输出结果:
在输出时将结束标志'\0'转换为'n',即输出完字符串后换行
2、gets函数
作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址
例如:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char string[20]; gets(string); printf("The string is:%s\n",string); system("PAUSE"); return 0; }
注意:用puts和gets函数只能输出或输入一个字符串,不能写成
puts(str1,str2)或gets(str1,str2)
3、strcat函数
一般形式strcat(字符数组1,字符数组2);
strcat是字符串连接的意思,其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符串1中,函数调用后得到一个函数值---字符数组1的地址。例如
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char str1[30] = {"People's Republic of"}; char str2[] = {" China"}; printf("%s",strcat(str1,str2)); system("PAUSE"); return 0; }
运行结果:
注意:
①字符数组1必须足够大,以便容纳连接后的新字符串。
②连接前两个字符串的后面都有'\0',连接时候将字符串1后面的'\0'取消,只在新串最后保留'\0'
4、strcpy和strncpy函数
一般形式
strcpy(字符数组1,字符串2)
作用是字符串复制,即将字符串2复制到字符数组1中,例如
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char str1[10]="",str2[]={"China"}; strcpy(str1,str2); printf("str1=%s\n",str1); system("PAUSE"); return 0; }
运行结果:
注意:
①字符数组1必须足够大
②字符数组1必须是数组名形式,字符数组2可以是字符串
strncpy函数将紫飞虎传2中当前n个字符复制到字符数组1中去。例如
strncpy(str1,str2,2)
作用是将str2中最前面2个字符复制到str1中,取代str1中原有的最前面的2个字符。但复制的字符个数n不应多于str1中原有的字符(不包括'\0')
5、strcmp函数
一般形式
strcmp(字符串1,字符串2)
它的作用是比较字符串1和字符串2,例如
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char str1[10]="abc",str2[]={"China"};
if(strcmp(str1,str2))
{
printf("str1 > str2\n");
}
if(strcmp("Hello","America"))
{
printf("Hello > America\n");
}
system("PAUSE");
return 0;
}
字符串比较规则:
"A"<"B","a"<"b","a">"A"
注意:
①如果字符串1=字符串2,则函数值为0
②如果字符串1>字符串2,则函数值为一个正整数
③如果字符串1<字符串2,则函数值为一个负整数
6、strlen函数
它是测试字符串长度的函数,函数值为字符串中实际长度(不包括'\0'在内),例如
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char str[10]={"China"}; printf("The length is %d\n",strlen(str)); system("PAUSE"); return 0; }
输出结果不是10,也不是6,而是5
7、strlwr函数
strlwr(字符串)
作用是将字符串中国的大写字母换成小写字母
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char str[10]={"China"}; printf("The string is %s\n",strlwr(str)); system("PAUSE"); return 0; }
8、strupr函数
其一般形式为
strupr(字符串)
作用是将字符串中小写的字母转换为大写字母
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char str[10]={"China"}; printf("The string is %s\n",strupr(str)); system("PAUSE"); return 0; }
二、统计一句话的单词个数
例子:
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
char string[81];
int i,num = 0,word = 0;
char c;
gets(string);
for (i=0;(c=string[i])!='\0';i++)
{
if(c == ' ')word=0;
else if (word == 0)
{
word = 1;
num++;
}
}
printf("There are %d words in the line.\n",num);
getchar();
return 0;
}
运行结果:
程序中变量i作为循环变量,num用来统计单词个数,word作为判别是否单词的标志,若word=0表示未出现单词,如果出现单词word就设置成1.
解题思路:
单词的数目可以由空格出现次数决定(连续的若干个空格作为出现一次空格;一行开头的空格不统计在内)。如果测出某一个字符为非空格,而它的面前的字符是空格(通过if(word == 0)来判断),则表示“新单词开始了”,此时使num(单词数)累加1.如果当前字符为非空格而其前面的字符也是非空格,则意味着仍然是原来那个单词的继续,num不应该在累加1,前面一个字符是否空格可以从word的值看出来,若word等于0,则表示前一个字符是空格;如果word等于1,意味着前一个字符为非空格。
如果输入"I am a boy",对每个字符的有关参数状态如下:
当前字符 | ﹄ | I | ﹄ | a | m | ﹄ | a | ﹄ | b | o | y | . |
是否空格 | 是 | 否 | 是 | 否 | 否 | 是 | 否 | 是 | 否 | 否 | 否 | 否 |
Word原值 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
新单词开始否 | 否 | 是 | 否 | 是 | 否 | 否 | 是 | 否 | 是 | 否 | 否 | 否 |
Word新值 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
Num值 | 0 | 1 | 1 | 2 | 2 | 2 | 3 | 3 | 4 | 4 | 4 | 4 |
注意:程序中for语句中的“循环条件”为
(c=string[i])!='\0'
它的作用是先将字符数组的某个元素(一个字符)赋给字符变量c。此时赋值表达式的值就应该是该市该字符,然后再判定它是否结束符,这个循环条件包含了一个赋值操作和一个关系操作。