字符串处置函数及统计单词个数
一、字符串处理函数
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。此时赋值表达式的值就应该是该市该字符,然后再判定它是否结束符,这个循环条件包含了一个赋值操作和一个关系操作。