10-0.皮肉を言う(20)
英語の文が与えられ、文内のすべての単語の順序を逆にするプログラムを書くように求められます。
入力形式:テスト入力にはテスト ケースが含まれており、1 行の合計長が 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 を見つける必要があります。見つからない場合は「見つかりません」を出力し、見つかった場合は文字列 S の c から始まるすべての文字を出力します。
入力形式:
入力では、1 行目ではキャリッジリターンで終了する長さ 80 文字以下の空でない文字列が指定され、2 行目では文字が指定されます。
出力フォーマット:
質問の要求に応じて、結果を 1 行で出力します。
入力例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 を含めることはできません。
入力形式:
S1 と S2 に対応する、長さが 80 文字以下で、キャリッジ リターンで終わる 2 つの空でない文字列を 2 行に入力します。
出力フォーマット:
文字列 S1 に含まれるすべての部分文字列 S2 を削除した結果の文字列を 1 行で出力します。
#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;
}