MOOC——C语言10:字符串

来源:互联网 发布:java导入项目中文乱码 编辑:程序博客网 时间:2024/05/01 08:15

1.字符串的-指针和数组的区别:

char * str = "hello";char word[] = "hello";

字符串指针默认为const的(即 const char *),所以只读不可写,(其实具体点是,不能通过str修改"hello"的值,原因见九章指针与const)。str是一个指针,初始化为指向一个字符串常量。

如果需要修改字符串,应该用数组。

如果要构造一个字符串->数组,

如果要处理一个字符串->指针。

#include<stdio.h>#include<string.h>void a_c(char []);void a_p(char *);int main(){    char a[]="i'm ok~";         printf("%s\n",a);    a_c(a);    printf("%s\n",a);    a_p(a);    printf("%s",a);     /*  指针不可写,error     char *b="error";    printf("%s\n",b);    a_c(b);    printf("%s\n",b);    a_p(b);    printf("%s",b);*/     return 0;}void a_c(char a[]){    int i=strlen(a),j=0;    while(j<i){        a[j]+=1;        j++;    } }void a_p(char *a){    int i=strlen(a),j=0;    while(j<i){        a[j]-=1;        j++;    } }

这么实验的,对于char * 和char []参数,都是可写的,只要定义的时候是数组就好。时间匆忙,技术有限,不求甚解。

2.字符串输入输出:

char string[8];scanf("%s",string);printf("%s",string);

scanf读入一个单词(到空格、tab或回车为止)。 //艾玛,原来可以这么输入的。

但这么输入是不安全的,因为没有检测是否越界。可以修改一下:

<span style="white-space:pre"></span>scanf("%7s",string);  //最多读取7个字符啦啦啦~

在%和s之间的数字表示最多允许读入的字符数量,这个数字应该比数组大小小一。//因为要给'\0'留位子。

3.字符串数组:

char a[][10]={"hello.","cat cat"};

char *a[]={"hello.","cat cat"};

4.字符串处理函数  <string.h>

strlen 返回字符串的长度(不包括结尾0)

size_t mystrlen(const char *s){int idx=0;while(s[idx] != '\0')idx++;return idx;} 

strcmp 比较两个字符串,相等返回0,s1>s2,返回差值(正数),s1<s2,返回差值(负数).

int mystrcmp(const char * s1,const char * s2){int idx=0;/*    while(1){if(s1[idx] != s2[idx])break;else if(s1[idx] == '\0')break;idx++;}*///改进版while(s1[idx] == s2[idx]  &&  s1[idx]!='\0')idx++; return s1[idx] - s2[idx];}

strcpy 把第二个字符串拷贝到第一个字符串。  复制字符串:char *dst = (char *)malloc(strlen(src)+1);    strcpy(dst,src);

char * mystrcpy(char* dst,const char* src){int idx=0;while(src[idx]){  //src[idx] != '\0'dst[idx]=src[idx];idx++;}dst[idx]='\0'; return dst;}

strcat 把s2连接到s1后面,连接成一个长字符串。

char * mystrcat(char *s1,const char *s2){  //这个是标准库=。= char * cp = s1;        while( *cp )            cp++;                          while( *cp++ = *s2++ ) ;          return s1;                }

strchr 字符串中查找字符,返回此字符开始的指针。

strstr 字符串中找字符串。


p.s.

'\0'和0等价,即

char s[10]={'h','e','l','\0','l','o'};char s[10]={'h','e','l',0};

是等价的噢。

10-0. 说反话

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。

输出格式:每个测试用例的输出占一行,输出倒序后的句子。

输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
#include <stdio.h>#include <string.h>int main(){const int max = 100;char s[max][max];int i,j,c='x';for(i=0;i<max & c!='\n' ;++i){for(j=0;j<max & (c=getchar())!='\n';++j){if(c==' '){s[i][j]='\0';//printf("i=%d\n",i);break;}else s[i][j]=c;//printf("%c",c);}}s[--i][j]='\0'; //最后回车会使得i多加了一次,所以这里减去。 //printf("i=%d\n",i);while(i){   //这里不会输出i==0。所以下面补上 printf("%s ",s[i]);--i;}printf("%s",s[0]);return 0;}

10-1. 在字符串中查找指定字符

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)

输入一个字符串S,再输入一个字符c,要求在字符串S中查找字符c。如果找不到则输出“Not found”;若找到则输出字符串S中从c开始的所有字符。

输入格式:

输入在第1行中给出一个不超过80个字符长度的、以回车结束的非空字符串;在第2行中给出一个字符。

输出格式:

在一行中按照题目要求输出结果。

输入样例1:
It is a black boxb
输出样例1:
black box
输入样例2:
It is a black boxB
输出样例2:
Not found
#include <stdio.h>void squeeze(char ,char[]);int main(){const int max = 90;char s[max];int i,c;for(i=0;i<max-1 && (c=getchar())!='\n';++i){s[i]=c;}s[i]='\0';char a;a=getchar();squeeze(a,s);return 0;}void squeeze(char c,char s[]){int i,j,b=0;for(i=j=0; s[i]!='\0';++i){if(s[i]==c)b=1;if(b==1)s[j++]=s[i];}s[j]='\0';if(b==1)printf("%s\n",s);else printf("Not found\n");}

10-2. 删除字符串中的子串

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。

输入格式:

输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。

输出格式:

在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

输入样例:
Tomcat is a male ccatatcat
输出样例:
Tom is a male 

#include <stdio.h>#include <string.h>int strdelstr( char *, char *);int main(){//char s1[]="tomcat is male ccatat";//char s2[]="cat";const int max=90;char s1[max];char s2[max];int i,c;for(i=0;i<max-1 && (c=getchar())!='\n';++i){s1[i]=c;}s1[i]=0;for(i=0;i<max-1 && (c=getchar())!='\n';++i){s2[i]=c;}s2[i]=0;int a;do{a=strdelstr(s1,s2);}while(!a);printf("%s",s1);return 0;}int strdelstr(char s1[],char s2[]){int i,j,k,R=1;  //R为返回标志,为1代表未修改。0代表修改过,就还得再检测一次。 int len=strlen(s2);for(i=j=0;s1[i]!=0;++i){int n=i,k=0;int len2=0;while(s1[n]==s2[k] && s2[k]!=0 ){len2++;k++;n++;}if(len2==len) {i+=len;R=0;}len2=0;s1[j++]=s1[i];}s1[j]='\0';return R;}

10-3. 字符串逆序

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

输入格式:

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

输出格式:

在一行中输出逆序后的字符串。

输入样例:
Hello World!
输出样例:
!dlroW olleH
#include <stdio.h>#include <string.h>void reverse(char []) ;int main(){const int max=90;char s[max];gets(s);reverse(s);printf("%s\n",s);return 0;}void reverse(char s[]){int c,i,j;for(i=0,j=strlen(s)-1; i<j;i++,j--){c=s[i];s[i]=s[j];s[j]=c;}} 

10-4. 字符串循环左移

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)

输入一个字符串和一个非负整数N,要求将字符串循环左移N次。

输入格式:

输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。

输出格式:

在一行中输出循环左移N次后的字符串。

输入样例:
Hello World!2
输出样例:
llo World!He
#include <stdio.h>#include <string.h>const int max=120;void left(char [],int);void my_getline(char []);int main(){char s[max];int n;my_getline(s);//fflush(stdin);scanf("%d",&n);if(n>0)left(s,n); printf("%s\n",s);return 0;}void left(char s[],int n){int len=strlen(s),i;//printf("%d\n",len);while(n--){char a=s[0];for(i=1;i<len;++i){s[i-1]=s[i];}s[--i]=a;}s[++i]='\0';}void my_getline(char s[]){int i;char c;for(i=0;i<max-1 && (c=getchar())!='\n';++i){s[i]=c;}s[i]=0;}


0 0