在C编程中;给定一个字符串,递归计算(无循环)一个新字符串,其中“pi”的所有外观都被“3.14”替换。

时间:2013-11-10 21:28:51

标签: c

我的代码无法正常工作,我做错了什么?正如标题所说,它应该创建一个用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 个答案:

答案 0 :(得分:1)

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

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

最后,它依赖于C字符串以nul字节('\ 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

答案 1 :(得分:0)

键入pipi

您正在传递b+4。实际上,在第一次pi之后,您需要检查第二个pi,因此您需要通过b+2

  return xy(a,b+4);

相应地修改您的代码。

答案 2 :(得分: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);
    }
}

答案 3 :(得分:-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;
}