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. 说反话
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过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. 在字符串中查找指定字符
输入一个字符串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. 删除字符串中的子串
输入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. 字符串逆序
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入格式:
输入在一行中给出一个不超过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. 字符串循环左移
输入一个字符串和一个非负整数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;}
- MOOC——C语言10:字符串
- MOOC——C语言2
- MOOC——C语言4
- MOOC——C语言5
- MOOC——C语言6
- MOOC——C语言7
- MOOC——C语言8
- MOOC——C语言9
- MOOC——C语言13:文件
- C语言 MOOC 身高
- C语言 MOOC 素数
- C语言MOOC视频地址
- MOOC——C语言11:结构类型:枚举,结构,联合
- MOOC——C语言12:程序结构:全局变量、预编译器和宏、大程序结构
- 中国大学MOOC-翁恺-C语言程序习题——第二周
- C语言——字符串
- C语言—字符串、指针
- C语言基础—字符串
- iOS 完全复制UIView
- linux下mysql安装、目录结构、配置
- MYSQL常用函数
- C++ 自动存储、静态存储和动态存储
- 正确理解ThreadLocal
- MOOC——C语言10:字符串
- Spring MVC @PathVariable 最后一个点(dot)以后的字符串(或说扩展名)丢失
- 多进制LDPC—EMS译码算法
- HDOJ 2016 数据的交换输出
- eclipse的maven-bulid命令介绍
- vs2005 如何把项目调为‘优化’状态
- ubuntu11.10 进入桌面只有鼠标或只有桌面背景,或黑屏解决办法.
- URL 地址通过 encode 方式加密
- objective-c中的本地化操作(序列化,归档)