1

コードが正しく動作しません。何が間違っていましたか? タイトルが示すように、「pi」を 3.14 に置き換える新しい文字列を作成することになっています。pi と入力すると問題なく動作しますが、「pipi」のようなものを入力すると、3.143.14 ではなく 3.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

あなたのコードはおそらく動作するようにいじめられる可能性がありますが、ポインターを転送する方が効率的です。コードの問題の 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に2番目を確認するpi必要があるため、渡す必要がありますb+2

  return xy(a,b+4);

それに応じてコードを変更します。

于 2013-11-10T21:37:51.473 に答える
0

You can modify your code as follows:

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 に答える