例子:涉及字符串、字符、指針、++等
例一:字符串與字符
#include <stdio.h> void reverse(char *str) { char *end=str; printf("%c\n",*str); //結果是a //printf("%s",*str); //以字符串輸出,有錯誤 printf("%s\n",str); //這樣輸出字符串是對的 printf("%c\n",*end); printf("%s\n",end); printf("%c\n",*str+1); //結果是b
} int main() { reverse("abcdef"); return 0; }
例二:統計字符串單詞的個數【如何去掉空格的問題】
#include "stdio.h" int count_word(char *str); void main() { char str1[80]; int sum=0; puts("please enter a string"); gets(str1); sum=count_word(str1); //返回的count就是sum printf("there are %d words in this sentence",sum); } int count_word(char *str) { int count,flag; char *p; count=0; flag=0; p=str; while(*p!='\0')/*當字符串沒有到結尾的時候,重頭到尾的循環*/ { if(*p==' ')/*假如字符串遇到空格,就將flag清零,同時可以過濾掉多余的空格*/ flag=0; else if(flag==0)/*當字符串不是空格時,假如flag為0,那么計算器加1,既是遇到空格后的第一個字符時*/ { flag=1;/*將flag標記回1,這樣在遇到第一個字符后的字符時可以將他過濾掉,直到遇到空格時,在清零*/ count++; //count就是統計單詞數的變量。其實就是單詞數的第一個字符,后面的字符都沒有統計了 } p++; //繼續加一。沒有遇到空格的時候 。直到繼續遇到空格或結尾的時候,才不加一了。 } return count; }
例三:字符串反轉
#include <stdio.h> void reverse(char *str) { char *z=str; char *end=str; char tmp; if(str) { while(*end) { ++end; } --end; //回退一個,找到null while(str < end) { tmp = *str; *str++ = *end; *end--=tmp; } } printf("%s",z); } int main() { char s[]="1234546"; reverse(s); //上面兩句,如果直接這么寫 reverse("123456789"); 就會有一個報警錯誤 return 0; }
例四:字符串長度
#include <stdio.h> void reverse(char *p) { if( *p=='\0') return ; reverse(p+1); printf("%c",*p); } int main() { reverse("abcdefghjklmn"); //為4 printf("%d",sizeof("abc")); //為3 printf("%d",strlen("abc")); printf("\n"); return 0; }
例五:字符串反轉【用遞歸和指針的方式】
#include <stdio.h> void reverse(char *p) { if( *p=='\0') return ; reverse(p+1); printf("%c",*p); } int main() { reverse("abcdefghjklmn"); printf("\n"); return 0; }
例六:統計字符串中每個單詞的頻率
#include "stdio.h" #include "stdlib.h" #include "string.h" int main() { int i=0,t,dc=0,zm[26]; char a[100]; for(i=0;i<26;i++) zm[i]=0; gets(a); i=0; while(a[i]!='\0') { if(a[i]!=' ') {while(a[i]>' ' ) {zm[a[i]-'a']++;i++;} dc++;} else i++; } for(i=0;i<26;i++) if(zm[i]>0) printf("\n%c出現了%d次\t",i+'a',zm[i]); printf("\n共有單詞%d個\n",dc); system("pause"); }
例七:字符串長度與字符串在內存的長度
#include "stdio.h" int main() { char str[6]="ABC"; char a[]="Program"; char *ptr="ABC"; printf("str = \"%s\"\n",str); printf("%d\n",strlen(a));//長度就是長度,sizeof是內存中的長度 。所以下面那個是6,這個是7 printf("%d\n",sizeof(a));//碰到第一個\0前面 ,並把\0計算在內。 printf("%d\n",strlen(str)); printf("%d\n",sizeof(str)); //根據初始化的6來定 printf("%d\n",sizeof(ptr));//碰到第一個\0前面 ,並把\0計算在內。 printf("ptr=\"%s\"\n",ptr); return 0; }
例八:在c語言中,字符串作為字符數組來考慮
#include "stdio.h" int main() { char a[]="Program"; char b[]={'p','r','o','g','r','a','m'};//在c語言中,將字符串作為字符數組來處理。(c++中不是) char c[]="'p','r','o','g','r','a','m'"; printf("%d\n",strlen(a)); printf("%d\n",sizeof(a)); printf("%d\n",strlen(b)); printf("%d\n",sizeof(b));// \0可以不要,相當於上面的數組初始化寫死了,后面沒有\0作為結束標記 printf("%d\n",strlen(c)); printf("%d\n",sizeof(c)); return 0; }
例九:如何存放字符串
在C語言中,可以用兩種方法表示和存放字符串:
(1)用字符數組存放一個字符串
char str[ ]="I love China";
(2)用字符指針指向一個字符串
char* str="I love China";
對於第二種表示方法,有人認為str是一個字符串變量,以為定義時把字符串常量"I love China"直接賦給該字符串變量,這是不對的。
C語言對字符串常量是按字符數組處理的,在內存中開辟了一個字符數組用來存放字符串常量,程序在定義字符串指針變量str時只是把字符串首地址(即存放字符串的字符數組的首地址)賦給str。
兩種表示方式的字符串輸出都用
printf("%s\n",str);
%s表示輸出一個字符串,給出字符指針變量名str(對於第一種表示方法,字符數組名即是字符數組的首地址,與第二種中的指針意義是一致的),則系統先輸出它所指向的一個字符數據,然后自動使str自動加1,使之指向下一個字符...,如此,直到遇到字符串結束標識符 " \0 "。
例十:截取字符串並依次輸出
#include "stdio.h" void AllSubstring(const char *str,int high) { int i, j, k; if(!str) return; for(i=0;i<=high;i++) { for(j=i; j<=high;j++) { for(k = i; k<=j; k++) printf("%c", str[k]); printf("\t"); } printf("\n"); } } int main(void) { AllSubstring("abcde",4); return 0; }