C语言_0322练习_字符串:printf(“%s“,*p);无法输出/字符串中查找字符串:指针指向字符串的某个位置,可以用数组的方式修改字符串的内容

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;
}

猜你喜欢

转载自blog.csdn.net/Shmily_as33/article/details/129723873