C——字符串練習,字符串練習
1.
查找一個字符在字符串1中出現的所有字符位置,
比如:
輸入
asdfwd
d
輸出為
3
6
輸入
hhff
h
輸出為
1
2
1 #include <string.h>
2 int main(int args,const char *argv[])
3 {
4 char a[100] = "sgfgeasdefw";
5 char target ;
6 scanf("%c",&target);
7 char *p = a;
8 while((p=strchr(p, target)))
9 {
10 printf("%ld\n",p-a+1);
11 p++;
12 }
13 }
2.
比較一個字符串2在字符串1中是否存在,如果存在輸出Y,否則輸出N
比如:
輸入
asdfwd
dfw
輸出為
Y
輸入
sgfgeasdfw
hhff
輸出為
N
1 #include <string.h>
2 int main(int args,const char *argv[])
3 {
4 char a[100] = "sgfgeasdfw";
5 const char *b = "ge";
6 //傳入的第二個參數,雖然是一個字符串,但是會自動解析位對應的每一個字符,之後判斷a字符串中出現的第一個位置
7 //strtok(a, b);
8 //strstr(const char *,const char *);返回的是子字符串中出現的第一個位置
9 if(strstr(a, b))
10 {
11 printf("Y");
12 }else{
13 printf("N");
14 }
15 }
3.
查找一個字符串2在字符串1中出現的次數,
比如:
輸入
asdfwd
d
輸出為
2
輸入
hhff
h
輸出為
2
1 #include <string.h>
2 int main(int args,const char *argv[])
3 {
4 char *src = "asfdasdfassdf";
5 char target[100] = {};
6 scanf("%s",target);
7 int cnt = 0;
8 char *p = src;
9 while((p=strstr(p, target)))
10 {
11 cnt++;
12 p++;
13 }
14 printf("出現的次數:%d",cnt);
15 return 0;
16 }
4.
給定一個任意字符串,然後將該字符串逆序輸出。
比如:
輸入
asdfwd
輸出為
dwfdsa

![]()
1 #include <string.h>
2 char *reverse(char *a)
3 {
4 int len = (int)strlen(a);
5 char b[100] = {0};
6 for(int i=len-1;i>=0;i--)
7 {
8 b[len-i-1] = a[i];
9 }
10 char *res = b;
11 return res;
12 }
13 int main(int args,const char *argv[])
14 {
15 char *a = "afdasfas";
16 char *res = reverse(a);
17 printf("%s",res);
18 return 0;
19 }
View Code
5.
題目描述:“eeeeeaaaff" 壓縮為 "e5a3f2",請編程實現
這題有一個比較尴尬的地方是,假如字符串是是“abc”,那麼如果化成“a1b1c1”超過了原來字符串的長度,又題目給的是原地,我們假設字符串原長度就是題目給的那麼長,那麼就沒辦法了,所以如果遇到單個字母的後面不加1

![]()
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4
5 void condense( char * src_str)
6 {
7 if(src_str==NULL)
8 return ;
9
10 int count=1;
11 int sub_length=1;
12 for(int i=1;i<strlen(src_str);i++)
13 {
14 if(src_str[i]==src_str[i-1])
15 {
16 count++;
17 }
18 else
19 {
20 if(count==1)
21 {
22 src_str[sub_length++]=src_str[i]; //單個只要賦值
23 }
24 else
25 {
26 src_str[sub_length++]=count+48; //多個要加上數字,+48變成ascii碼
27 src_str[sub_length++]=src_str[i];
28 count=1;
29 }
30 }
31 }
32
33 if(sub_length<strlen(src_str))
34 src_str[sub_length]='\0';
35
36 printf("%s \n",src_str);
37
38
39 }
40
41 int main()
42 {
43 char str[]="abbbdffeeg";
44 condense(str);
45 getchar();
46 return 0;
47 }
View Code
6.題目描述:“eeeeeaaaff" 壓縮為 "e5a3f2",並用一個字符串存儲,通過子函數實現,結果用指針函數返回,請編程實現

![]()
1 #include <string.h>
2 #include <ctype.h>
3 char *getStringToCompress(char *src)
4 {
5 char compress[100] = {};
6 int cnt = 0;
7 char *psrc = src;
8 char al[100] = {};
9 int num[100] = {0};
10 int i = 0;
11 while(*psrc)
12 {
13 cnt++;
14 if(*psrc != *(psrc+1))
15 {
16 num[i] = cnt;
17 al[i] = *psrc;
18 cnt = 0;
19 i++;
20 }
21 psrc++;
22 }
23 int len = (int)strlen(al);
24 char buf[100] = "";
25 //將保持在al和num數組中的元素轉換成字符數組,保持到compress字符數組中
26 for(int h=0;h<len;h++)
27 {
28 if (isalpha(al[h])) {
29 sprintf(buf, "%c", al[h]); //利用sprintf(char *buf,const char *format,argument,...)將字符轉位字符串類型
30 strcat(compress, buf);
31 }
32 if (!isalpha(num[h])) {
33 sprintf(buf, "%d", num[h]); //利用sprintf()函數將數字轉換為
34 strcat(compress, buf);
35 }
36 }
37 char * res = compress;
38 return res;
39 }
40 int main(int args,const char *argv[])
41 {
42 char src[100] = "eeeeeaaaaaaaaaaaff";
43 char *compress = getStringToCompress(src);
44 printf("%s",compress);
45 return 0;
46 }
View Code