字符串
在C语言中,字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。
下面的声明和初始化创建了一个 “Hello” 字符串。由于在数组的末尾存储了空字符(’\0’)
,所以字符数组的大小比单词 “Hello” 的字符数多一个。
char str[6]={'h','e','l','l','o','\0'};// '\0'为结束符号
//也可以这样初始化
char str[6]="hello"
由此引出单引号和双引号的区别:
‘a’ 表示是一个字符,“a” 表示一个字符串相当于 ‘a’+’\0’;
‘’ 里面只能放一个字符;
“” 里面表示是字符串系统自动会在串末尾补一个 0。
str[0] | str[1] | str[2] | str[3] | str[4] | str[5] |
---|---|---|---|---|---|
h | e | l | l | o | \0 |
~~如果这样定义:
char str[5]="hello";~
~~这样的定义是错误的。在vs2010下会出现“数组界限溢出”的错误~
//也可以省略常量表达式
char str[]="hello";
//编译器会自动添加'\0',并且认为[ ]中为6
//也就是说str数组的字节数为6
C 中有大量操作字符串的函数:
gets(str);//输入一串字符给s
puts(str);打印字符串s
也可以用scanf和printf进行输入和输出
scanf("%s",str);//对于字符串而言不用添加&,因为str就表示他的地址
printf("%s",str);
序号 | 函数 | 作用 |
---|---|---|
1 | strcpy(s1, s2); | 复制字符串 s2 到字符串 s1 |
2 | strcat(s1, s2); | 连接字符串 s2 到字符串 s1 的末尾 |
3 | strlen(s1); | 返回字符串 s1 的长度 |
4 | strcmp(s1, s2); | 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0; |
这些函数均在string.h的头文件下。
简单的使用一下这些函数:
#include<string.h>//如果不添加此头文件,会出现" 找不到标识符"的错误
int main()
{
char a[20]="hello";
char b[10];
char c[20]="world";
char d[]=" ";
printf("%d\n",strcmp(a,c));
strcpy(b,a);
puts(b);
strcpy(b,c);
puts(b);
puts(a);
printf("%d\n",strlen(a));
strcat(a,d);
strcat(a,c);
puts(a);
printf("%d\n",strlen(a));
return 0;
}
输出结果:
-1
hello
world
hello
5
hello world
11
例:输入一个字符串,统计字母,数字,空格,其他字符个数
#include<string.h>//不加此头文件,会出现“strlen:表示符未定义”
int main()
{
char ch[20];
int letter=0,space=0,number=0,other=0,i,len;
gets(ch);
len=strlen(ch);
for(i=0;i<len;i++)
{
if((ch[i]>='a'&&ch[i]<='z')||(ch[i]>='A'&&ch[i]<='Z'))
letter++;
else if(ch[i]==' ')
space++;
else if(ch[i]>'0'&&ch[i]<'9')
number++;
else
other++;
}
printf("字母:%d",letter);
printf("数字:%d",number);
printf("空格:%d",space);
printf("其他:%d",other);
return 0;
}