字符串数组例题
注:上一节的函数只能用于字符型数组
例如:strcpy() ,strcat(),strcmp()
注:注意for循环的范围,注意字符串结束符是'\0',注意函数的实现原理。
1、下面程序段的运行结果是_________.
char a[7]="abcdef";
char b[4]="ABC";
strcpy(a,b);
printf("%c",a[5]);
a)空格 b)\0 c)e d)f
答案: D
2、输入一行字符,统计其中大写字母的个数,并将所有的大写字母转化成小写字母后输出
int main()
{
//输入一行字符
printf("请输入一行字符串:\n");
char ch[1024] ="\0";
scanf("%s",ch);
//统计其中大写字母的个数
int count = 0;
for(int i =0;i<strlen(ch);i++)
{
if(ch[i]>='A' && ch[i]<='Z')
{
count++;
//将所有的大写字母转化成小 写字母
ch[i]+=32;
}
}
printf("大写字母的个数:%d\n",count);
printf("转换后:%s\n",ch);
return 0;
}
3、按以下规律翻译密码: 将每一个字母变成它后面的字母,例如,将 A 变成 B,B 变成 C,…,Z 变成 A,非字母字符不变,“!”作为电文结束标志。
注: 要在字符串的最后加个'\0'
int main()
{
//1.输入密码
printf("请输入密码:\n");
char pwd[1024] = "\0";
scanf("%s",pwd);
//将每一个字母变成它后面的字母,例如,将 A 变成 B,B 变成 C,…,Z 变 成 A,非字母字符不变
int i = 0;
for(i = 0;pwd[i] !='\0';i++)
{
if(pwd[i]>='A' && pwd[i]<'Z')
{
pwd[i]++;
}
else if(pwd[i] == 'Z')
{
pwd[i] = 'A';
}
else if(pwd[i]>='a' && pwd[i]<'z')
{
pwd[i]++;
}
else if(pwd[i] == 'z')
{
pwd[i] = 'a';
}
}
//3. “!”作为电文结束标志
pwd[i] = '!';
pwd[i+1] = '\0';
//输出
printf("%s\n",pwd);
return 0;
}
4、输入密码,设置一个密码,然后输入密码,机会为 3 次,三次密码错误就直接退出。
int main()
{
//设置密码
char pwd[20] = "123456";
for(int i=0;i<3;i++)
{
//输入密码
printf("请输入密码:\n");
char mm[20] = "\0";
scanf("%s",mm);
//判断密码是否正确
if(strcmp(pwd,mm) == 0)
{
printf("密码正确!\n");
return 0;
}
else
{
printf("密码输入错误!");
if(i == 2)
{
printf("您的机会已用完!\n");
}
else
{
printf("您还有%d次机会!\n",2-i);
}
}
}
return 0;
}
5、不使用 strlen 函数,实现字符串的求长度,复制,比较,连接。
注:ch[i] != '\0' ==> ch[i] != 0 (ASCLL码)
#include <stdio.h>
#include <string.h>
#define N 4
/*
作者: zcy
日期:
功能描述:不使用 strlen 函数,实现字符串的求长度,复制,比较,连接
*/
int main()
{
#if N == 1
//长度
char ch[1024] = "he\0llo";
//判断该字符是否是\0,若是结束统计,不是 进行统计
int i = 0; // 默认从第0个字符开始
while(ch[i])
{
i++;
}
printf("i = %d\n",i);
#elif N == 2
//复制
char dest[1024] = "hello";
char src[1024] = "ab\0cd";
//根据源串中字符是否是\0,若是结束复制 ,不是则把字符赋值给目的串
int i = 0;
while(src[i])
{
dest[i] = src[i];
i++;
}
dest[i] = '\0';
printf("dest = %s\n",dest);
#elif N == 3
//连接
char dest[1024] = "he\0llo";
char src[1024] = "abc\0d";
//先找到目的串\0的位置
int i =0;
while(dest[i])
{
i++;
}
//根据源串中字符是否是\0,若是结束拼接 ,不是则把字符赋值给目的串
int j = 0;
while(src[j])
{
dest[i] = src[j];
i++;
j++;
}
//补'\0'
dest[i] = '\0';
printf("dest = %s\n",dest);
#elif N == 4
//比较
char s1[1024] = "abcd";
char s2[1024] = "abcd";
//求两个字符串的长度
int l1 = 0;
while(s1[l1])
{
l1++;
}
int l2 = 0;
while(s2[l2])
{
l2++;
}
//获得两个数最长的
int l = l1>l2?l1:l2;
//循环比较并相减
int n = 0;
for(int i = 0;i<l;i++)
{
if(s1[i] - s2[i] != 0)
{
n = s1[i] - s2[i]; //只需判断一位不同的差值即可,只要有差值,就说明不同,无需在意差值多少。
break;
}
}
printf("n = %d\n",n);
#endif
return 0;
}
6、输入一个字符串,判断是否是回文。(回文:这个字符串顺读和反读是一样的。如“abcba”和”123321”都是回文。
int main()
{
//输入一个字符串
printf("请输入一个字符串:\n");
char ch[1024] = "\0";
scanf("%s",ch);
int l = strlen(ch);
int flag = 1;
for(int i=0;i<l/2;i++)
{
if(ch[i] != ch[l-1-i])
{
flag = 0;
printf("%s不是回文!\n",ch);
//break;
return 0;
}
}
//if(flag)
printf("%s是回文!\n",ch);
return 0;
}
7、一篇文章,有三行文字,每行有 80 个字符。要求统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。(二维数组)
#include <stdio.h>
/*
作者: zcy
日期:
功能描述:一篇文章,有三行文字,每行有 80 个字符。 要求统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数
*/
int main()
{
//输入三行文字,每行有 80 个字符
printf("请输入三行文字:\n");
char ch[3][80] = {0};
for(int i = 0;i<3;i++)
{
gets(ch[i]);
}
//统计
int dz=0,xz=0,sz=0,kg=0,qt=0;
for(int i = 0;i<3;i++)
{
for(int j = 0;j<strlen(ch[i]);j++) //注意范围
{
char s = ch[i][j];
if(s>='A' && s<='Z')
{
dz++;
}
else if(s>='a' && s<='z')
{
xz++;
}
else if(s>='0' && s<='9')
{
sz++;
}
else if(s==' ')
{
kg++;
}
else
{
qt++;
}
}
}
printf("大写:%d\n",dz);
printf("小写:%d\n",xz);
printf("数字:%d\n",sz);
printf("空格:%d\n",kg);
printf("其他:%d\n",qt);
return 0;
}