目录
目前我们所学习到的是围绕字符串的处理,仅仅是生成字符串、读取并显示字符串,下面我学习更加灵活处理字符串的方式。
我们来看下述语句声明的数组:
char str[6] = "ABC";
元素个数为6的数组保存了元素个数为3的(算上字符串末尾的null字符,则长度为4)的字符串,因此str[4] str[5]都是空的,由此可知字符串不一定正好撑满字符组。
因为字符串含有表示末尾的null字符,所以第一个字符到\0为止的前一个字符就是该字符串的长度,我们可以据此来计算字符串的长度:
#include<stdio.h>
/*返回字符串str的长度*/
int str_length(const char s[])
{
int len = 0;
while(s[len])
len++;
return len;
}
int main()
{
char str[128];
printf("请输入字符串:");
scanf("%s", str);
printf("字符串\"%s\"的长度为%d.\n", str, str_length(str));
return 0;
}
让我们来分析程序时如何执行的:
1.main函数在调用str_length函数传入的实参str,通过前面的学习可知,实参只有给出数组名称就可以了
2.通过数组的传递,函数str_length所接受的s就是main函数中的str本身
3.在str_length函数中使用变量len,遍历数组使用计算字符串的长度。
4.while语句中表达式正是数组,通过len++是数组下标逐个增加,进而判断数组元素是否为0,即字符串结束的标志“\0”。
下面我们来演示下在遍历过程中使用while语句是如何判断的:
这次我们不使用printf和puts函数,而只使用putchar函数显示字符串:
#include<stdio.h>
/*显示字符串s*/
void put_string(const char s[])
{
int i = 0;
while(s[i])
putchar(s[i++]);
}
int main()
{
char str[128];
printf("请输入字符串:");
scanf("%s", str);
printf("你输入了:");
put_string(str);
printf("。\n");
return 0;
}
在本程序中对字符串中字符进行遍历时使用的while语句对null字符的查找方式一样。
#include<stdio.h>
/*将字符串s出现的数字字符保存在数组cnt中*/
void str_dcount(const char s[], int cnt[])
{
int i = 0;
while(s[i])
{
if(s[i]>='0' && s[i]<='9')
cnt[s[i] - '0']++;
i++;
}
}
int main()
{
int dcnt[10] = {0};
char str[128];
int i;
printf("请输入字符串:");
scanf("%s", str);
str_dcount(str, dcnt);
puts("字符出现的次数");
for(i=0;i<10;i++)
printf("'%d' :%d\n", i, dcnt[i]);
return 0;
}
大家可能对程序中下面的代码部分有些生疏:
if(s[i]>='0' && s[i]<='9')
cnt[s[i] - '0']++;
i++;
特别是关于cnt数组,中表达式的运算:任意的字符减去‘0’,都能得到所需要的下标值
大家可以看下面这个文章是关于字符的介绍:https://blog.csdn.net/W06164932/article/details/135150160?spm=1001.2014.3001.5502
我们来编写两个函数,一个字符串中所有的字符转换为大写字母,一个全部转换为小写字母
#include<stdio.h>
#include<ctype.h>
/*将字符串的字符全部转化为大写*/
void str_toupper(char s[])
{
int i = 0;
while(s[i])
{
s[i] = toupper(s[i]);
i++;
}
}
/*将字符串的字符全部转换为小写*/
void str_tolower(char s[])
{
int i = 0;
while(s[i])
{
s[i] = tolower(s[i]);
i++;
}
}
int main()
{
char str[128];
printf("请输入字符串:");
scanf("%s", str);
str_toupper(str);
printf("大写字母:%s\n", str );
str_tolower(str);
printf("大写字母:%s\n", str );
return 0;
}
我们分别来看下关于toupper函数与tolower函数:
toupper | |
头文件 | #include<ctype.h> |
原型 | int toupper(int c); |
说明 | 将小写字母转换为大写字母 |
返回值 | 若c是小写字母,则返回转换后的大写字母,否则之间返回c |
tolower | |
头文件 | #include<ctype.h> |
原型 | int tolower(int c); |
说明 | 将大写字母转换为小写字母 |
返回值 | 若c是大写应为字母,则返回转换后的小写字母,否则之间返回c |
在使用这两个函数遍历字符串过程中,当发现目标字符s[i],会为其赋这些函数的返回值。
如果这两个函数是接受的是英文字母以外的字符,则原封不动的返回这些字符
#include<stdio.h>
void put_strary(const char s[][6], int n)
{
int i;
for(i=0;i<n;i++)
{
printf("s[%d]=\"%s\"\n", i, s[i]);
}
}
int main()
{
char cs[][6] = {"max", "mike", "HELLO"};
put_strary(cs, 3);
return 0;
}
在二维数组的形参声明中只有,只有第一维的数组元素数可以省略。
看如下声明:
char str[4] = {"ABCD'};
算上null字符需要5个字符空间,但数组只能接受4个字符,但是像下面这样进行声明,末尾就会不会加上null字符:
char str[4] = {'A', 'B', 'B', 'D'};
这样声明的变量末尾不会加上null字符,我们把它当做4个字符的集合,也就是“普通的数组”