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 box b输出样例1:
black box输入样例2:
It is a black box B输出样例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 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[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;
}