1

我的代码不能正常工作,我做错了什么?正如标题所说,它应该创建一个用 3.14 替换 'pi' 的新字符串。当我输入 pi 时它可以正常工作,但是当我输入像“pipi”这样的东西时它只返回 3.14 而不是 3.143.14...谢谢你的帮助:)

#include<stdio.h>
#include<string.h>
char c[50];
char xy(char a[],int b)
{
    if(b>=strlen(a))
        return a;
    else if(a[b]=='p' && a[b+1]=='i'){
        c[b]='3';
        c[b+1]='.';
        c[b+2]='1';
        c[b+3]='4';
        return xy(a,b+4);}
    else if(a[b]!='i') {
        c[b]=a[b];
        return xy(a,b+1);
    }
}

int main()
{
    char a[50];
    scanf("%s",&a);
    xy(a,0);
    printf("%s",c);
    return 0;
}
4

4 回答 4

1

您的代码可能会被戏弄为工作,但转发指针会更有效。您的代码的一个问题scanf("%s", &a)是它将在第一个空格处停止。

以下返工消除了返回任何东西的需要,只有一个流向。它还消除了全局“c”。

最后,它依赖于 C 字符串以空字节 ('\0') 终止这一事实,从而无需了解 src 字符串的大小。

注意:一个好的优化器会把它变成一个循环:)

#include <stdio.h>

void transform(char* dst, const char* src)
{
    if(!*src) {
        *dst = '\0';
        return;
    }
    if(*src == 'p' && *(src + 1) == 'i') {
        *(dst++) = '3';
        *(dst++) = '.';
        *(dst++) = '1';
        *(dst++) = '4';
        src += 2;  // skip 'pi' in src.
    } else {
        *(dst++) = *(src++);
    }
    transform(dst, src);
}

int main()
{
    char a[64], b[64];
    fgets(a, sizeof(a), stdin);
    transform(b, a);
    printf("%s", b);

    return 0;
}

现场演示:http: //ideone.com/15q17k

于 2013-11-10T21:45:20.453 回答
0

当您键入pipi

你在这里路过b+4。实际上在第一个之后pi你需要检查第二个pi所以你需要通过b+2

  return xy(a,b+4);

相应地修改您的代码。

于 2013-11-10T21:37:51.473 回答
0

您可以按如下方式修改您的代码:

char xy(char a[],int b, int i)
{
    if(i>=strlen(a))
        return a;
    else if(a[i]=='p' && a[i+1]=='i') {
        c[b]='3';
        c[b+1]='.';
        c[b+2]='1';
        c[b+3]='4';
        return xy(a,b+4, i+2);
    }
}
于 2020-05-23T09:39:17.367 回答
-1

试试这个:

include <iostream>
include <cstring>
using namespace std;

char* replace(char* a, char* b) 
{
    int len = strlen(b);

    if(a[0] == '\0') {
      b[len] = '\0';
      return b;
    }

    if(a[0]=='p' && a[1]=='i'){
        b[len + 0]='3';
        b[len + 1]='.';
        b[len + 2]='1';
        b[len + 3]='4';
        b[len + 4] = '\0';
        replace(a + 2,b);
    }

    else {
        b[len + 0]= a[0];//h
        b[len + 1] = '\0';//'\0'
        replace(a + 1, b);//ellopi
    }
}

void transform(char input[])
{
   char *arr=new char[strlen(input) * 2+1];
   arr[0] = '\0';
   strcpy(input, replace(input, arr));
}

int main()
{
    char a[100];
    cin.getline(a,100);
    transform(a);

    cout<<a;

    return 0;
}
于 2018-09-21T19:19:06.470 回答