c语言-数组(3)
字符串数组例题
注:上一节的函数只能用于字符型数组
例如: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);#endifreturn 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;
}