MOOC——C语言10:字符串
2014-07-25 10:27
232 查看
1.字符串的-指针和数组的区别:
字符串指针默认为const的(即 const char *),所以只读不可写,(其实具体点是,不能通过str修改"hello"的值,原因见九章指针与const)。str是一个指针,初始化为指向一个字符串常量。
如果需要修改字符串,应该用数组。
如果要构造一个字符串->数组,
如果要处理一个字符串->指针。
这么实验的,对于char * 和char []参数,都是可写的,只要定义的时候是数组就好。时间匆忙,技术有限,不求甚解。
2.字符串输入输出:
scanf读入一个单词(到空格、tab或回车为止)。 //艾玛,原来可以这么输入的。
但这么输入是不安全的,因为没有检测是否越界。可以修改一下:
在%和s之间的数字表示最多允许读入的字符数量,这个数字应该比数组大小小一。//因为要给'\0'留位子。
3.字符串数组:
char a[][10]={"hello.","cat cat"};
char *a[]={"hello.","cat cat"};
4.字符串处理函数 <string.h>
strlen 返回字符串的长度(不包括结尾0)
strcmp 比较两个字符串,相等返回0,s1>s2,返回差值(正数),s1<s2,返回差值(负数).
strcpy 把第二个字符串拷贝到第一个字符串。 复制字符串:char *dst = (char *)malloc(strlen(src)+1); strcpy(dst,src);
strcat 把s2连接到s1后面,连接成一个长字符串。
strchr 字符串中查找字符,返回此字符开始的指针。
strstr 字符串中找字符串。
p.s.
'\0'和0等价,即
是等价的噢。
时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
输出样例:
时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)
输入一个字符串S,再输入一个字符c,要求在字符串S中查找字符c。如果找不到则输出“Not found”;若找到则输出字符串S中从c开始的所有字符。
输入格式:
输入在第1行中给出一个不超过80个字符长度的、以回车结束的非空字符串;在第2行中给出一个字符。
输出格式:
在一行中按照题目要求输出结果。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
输出样例:
时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入格式:
输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。
输出格式:
在一行中输出逆序后的字符串。
输入样例:
输出样例:
时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
输出样例:
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 box b
输出样例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 ccatat cat
输出样例:
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 ==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; }
相关文章推荐
- 【C语言】10-字符和字符串常用处理函数
- 【C语言】10-字符和字符串常用处理函数
- 【C语言】10-字符和字符串常用处理函数
- Linux下的C语言编程——10进制转换成任意进制的字符串
- 【C语言】10-字符和字符串常用处理函数
- IOS开发笔记10-字符串-C语言笔记
- c语言练习 10-4. 字符串循环左移(20)
- C语言实现字符串中(10进制和16进制)转成十进制数
- 【C语言】10-字符和字符串常用处理函数
- c语言练习 10-3. 字符串逆序(15)
- C语言实现字符串中(10进制和16进制)转成十进制数
- c语言练习 10-2. 删除字符串中的子串(20)
- C语言实现字符串中(10进制和16进制)转成十进制数
- 【C语言】10-字符和字符串常用处理函数
- c语言练习 10-1. 在字符串中查找指定字符(15)
- 【C语言】10-字符和字符串常用处理函数
- C语言学习篇-10指针与字符串、函数指针
- 黑马程序员--C语言自学笔记---10字符串、指针
- C源码:可以检测10 种C语言编译环境的程序
- c语言字符串函数大全