第九课 字符数组例题

字符数组例题

定位置删除

一 从键盘获取一串字符,同时输入一个位置 l,将字符中 l 位置字符删除;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
char st[50];
int i,l,t;
printf("input char:");
gets(st);
printf("清输入位置l:");
scanf("%d",&l);

for(i=i+1; i<strlen(st)+1; i++){    // +1;注意最后面的 \0
    st[i-1] = st[i];
}

printf("%s\n",st);

二 从键盘获取一串字符,再输入一个m,n(m<=n),请删除字符串中 m 到 n 之间字符;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
char st[100];
int i,j,m,n,k=0;
gets(st);
printf("input m,n:")
while(m>n)
    scanf("%d%*c%d",&m,&man);
i = m;
for(j=n+1; j<=strlen(st); j++){
    st[i++] = st[j];
    }
}
printf("%s\n",st);

三 定字符删除:从键盘输入一串字符st,再输入一个字符c,将字符串中的c删除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
char st[100];
int i,j;
char c;
printf("input st:");
gets(st);
printf("input c:")
scanf("%c",&c);                             // 假若 gets后跟着getchar,输入的空格是否会被读入

for(i=0; i<strlen(st); i++){                // 查找要删除的字符
    if(c == st[i])
        for(j=i+1; j<strlen(st)+1; j++){    // 从i+1位置到end(包括),把每个字符往前移动一位,覆盖
            a[j-1] = a[j];
        }
    if(st[i]==c) i--;                           // 此处弥补漏洞,如果下一个数还是c,就i--
    }
}

printf("%s\n",st);

四 子串的查找:已知 st1,问 st2 是否出现在 st1 中,若是出现,返回首次出现的位置,否则返回-1;有两种解决方法,一种直观朴素匹配方法,一种是KMP匹配经典算法;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 经典算法,回溯,这个代码有点儿不流畅,需重新构建
char st1[100],st2[100];
int i,j,k=-1;
printf("input st1:");
gets(st1);
printf("input st2:");
gets(st2);

i = 0;
while(st1[i]!='\0'){
    k = i;
    for(j=0; st2[j]!='\0'; j++)
        if(st1[k]==st2[j]) k++;
        else break;
    if(st2[j] == '\0'){
        printf("%d\n",i);
        break;
    }else i++;
}
if(st1[i]=='\0'){
    printf("-1");
}

如果 st1[i] == st2[j], i++,j++

如果 st1[i] != st2[j], j=0,i++

当 st2 到底时,说明找到位置;

当 st1 到底时,说明没有找到;

五 用户自己设计程序实现两个字符串的连接

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
char s1[20] = "aaa";
char s2[] = "bbb";
// 不使用 strcat 函数,拼接字符串

int i,j,k;

for(i=0;s1[i]!='0';i++);        // 将 i 指向末尾,即'\0';    获取s1的结束位置

for(j=0; s2[j]!='\0'; j++)      // 将 s2 开始位置逐一往 s1 连接
    s1[i++] = s2[j];            // s2数组拼接在s1后面
s1[i] = '\0';                   // 补上 '\0'

printf("%s\n",s1);              // 输出 result

回文判定

什么是回文?从字符串的左边读和从字符串的右边读顺序是相同的;

例如:abcba

一 从键盘输入一串字符,判定是否为回文,是输出"yes",不是输出"no";

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
char st[30];
int i,j;
printf("input st:");
gets(st);
i = 0;
j = strlen(st)-1;    // 区分个数和下标

while(i<=j){
    if(st[i] == st[j]){
        i++; i--;
    }else break;
}

if(i<j) printf("No");
else printf("Yes");

二 从键盘输入一串符号,判定这串符号如果都是数字,输出1,否则输出0;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
char a[100];
int i,j,k;
gets(a);

for(i=0; i<strlen(a); i++)
    if(!(a[0]>=48 && a[0]<=57))
        break;

if(a[i]=='\0') k=1;
else k=0;

printf("%d\n",k);

更多

一 从键盘输入一串数字符号,把数字符号转化为数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
char st[100];
int i,j=0,k;
printf("input st:");
gets(st);

for(i=0;i<strlen(st);i++){        // 取位
    j = st[i]-'0';            // 任何数字符号-'0'都等于数字本身
    k=k*10+j;
}

printf("%d\n",k);

解决思路:

  1. 取位
  2. 把这个位和数字符号,要转换为数
  3. 取出来一位,前面就和升位,把当前这个位加上去

二 从键盘输入一串字符,统计每个小写字母出现的次数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
int st[100],f[26];
int i,j,k=0;
printf("input st:");
gets(st);

for(i=0; st[i]!='\0';i++){
    if(st[i]>=97 && st[i]<=122){
        f[st[i]-'a']++;                // 通过符号判断下标
    }
}

for(i=0; i<26; i++){
    if(f[i]!=0) printf("%c:%d\n",i+'a',f[i]);
}
Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy