字符数组例题
定位置删除
一 从键盘获取一串字符,同时输入一个位置 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
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]);
}
|