10-0. 说反话 (20)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。

#include <stdio.h>
#include <string.h>
int main(void)
{
char str[81];//总长度不超过80的字符串 还加了最后一位\0
gets(str);//可以输入空格 以回车结束
char *p=str;
int sig=1;
//将指针挪到最后一个字符
while(*(p+1)!='\0'){
//comparison between pointer and integer
//指针要用单引号【‘’】
p ++;
}
//开始输出
while(sig)
{
if( *p==' '&& *(p+1)!=' ')
{
*p='\0';
printf("%s ",(p+1));
//printf("%s ",*(p+1)); 不会报错 但是无法输出
}
else if(p==str)//读到了第一位
{
sig=0;
printf("%s",p);
//printf("%s",*p);无法输出
}
p --;
}
}
printf("%s",*p);无法输出
printf("%s",p);无法输出 输出p指向的字符串【以\0结束】
printf("%c",*p);输出p所指的那个地址上面的一个字符
10-1. 在字符串中查找指定字符(15)
输入一个字符串S,再输入一个字符c,要求在字符串S中查找字符c。如果找不到则输出“Not found”;若找到则输出字符串S中从c开始的所有字符。
输入格式:
输入在第1行中给出一个不超过80个字符长度的、以回车结束的非空字符串;在第2行中给出一个字符。
输出格式:
在一行中按照题目要求输出结果。
输入样例1:

#include <stdio.h>
#include <string.h>
int main(void)
{
char str[81];
gets(str);
//第1行中给出一个不超过80个字符长度的
//以回车结束的非空字符串;
char f;
scanf("%c",&f);
char *p=strchr(str,f);
if(p)//指针有指向地址就执行
{
printf("%s",p);
}
else{//指针为空
printf("not found");
}
}
10-2. 删除字符串中的子串(20)
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

#include <stdio.h>
#include <string.h>
int main(void)
{
int i,k,sig=1;
int l;
char s1[81];
gets(s1);
char s2[81];//要删除的 cat
gets(s2);
char *s4=s1;
//输入在2行中分别给出不超过80个字符长度的、
//以回车结束的2个非空字符串,对应S1和S2
char s3[81];
k=strlen(s2);
l=k;
char *p=s2;//p指向cat
char *q=strchr(s1,*p);
char *ans=s2;//因为后面p-- 这里临时保存一下
while(sig)
{
char*q=strchr(s4,*p);//只查找cat的c
while(k)//cat三个都一致
{
if(*p==*q)
{
p ++;
q ++;
k --;
}
else{
sig=0;
continue;
}
}
if(sig)
{
// printf("p:%s\n",p);
// printf("ans:%s\n",ans);
// printf("q:%s\n",q);
strcpy(s3,q);
//printf("s1:%s\n",s1);
*(q-l)='\0';
// printf("s1:%s\n",s1);
strcat(s1,s3);
}
k=l;
p=s2;
}
printf("%s",s1);
}
正确答案:
#include <stdio.h>
#include <string.h>
char s1[81], s2[81];
int main()
{
int i, k;
gets(s1);//tomcatysscattom
gets(s2);
char *p = strstr(s1, s2);//指针pz指向第一个c tomcatcattom
while(1)
{
char *p = strstr(s1, s2);//catysscattom
if ( p )//如果还能找到cat
{
for ( i=0; i<strlen(p) - strlen(s2); i++ )
{
p[i] = p[strlen(s2) + i];//将后面的往前移
}
p[i] = '\0';//p:ysscattom\0
}
else
{
puts(s1);
break;
}
printf("此时s1=%s",s1); //tomysscattom
}
return 0;
}
解析:
指针指向字符串的某个位置,可以用数组的方式修改字符串的内容。
char s1[81];
int main()
{
gets(s1);//123456789
char *p = s1;
p[5]='\0';
printf("%s",s1);//12345
return 0;
}