c语言字符串实例
例子:涉及字符串、字符、指针、++等
例一:字符串与字符
#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; }