使用指针替换C字符串中的字符

时间:2013-10-21 03:44:01

标签: c++ c pointers

这不是家庭作业,而是研究期中考试。

我不能使用任何类型的数组索引,例如str [i]或*(str + i)

我必须使用c-string“EECS280ISAWESOME”并用“C”字符串“XY”替换“E”。我还必须允许多个长度的“XY”变量。

给出以下主要内容:

int main () {
    const char* S = "EECS280ISAWESOME";
    const char* P = "XY";
    char result[256];
    subsituteChar(S,P,'E', result);
    cout << result << endl;
} 

我的解决方案看起来很复杂/糟糕/丑陋。我可以通过使用引用和添加*(R+1)来做得更好,但我不认为这是允许的。

void subsituteChar(const char* S, const char* P, char c, char* R) {
    while(*S != '\0') {
        if(*S == c) {
            const char* PP = P;
            while (*P != '\0') {
                *R = *P;
                R++;
                P++;
            }
            P = PP;
        } else {
            *R = *S;
            R++;
        }
        S++;
    }
}

这有效,但我留下了XYXYCS280ISAWXYSOMXY2。我不知道奇怪的2来自哪里。

3 个答案:

答案 0 :(得分:0)

由于这是一个研究问题,这里有一个提示让你入门。尝试初始化结果数组。我这样做了:

char result[256];
for (int i = 0; i < 250; ++i)
    result[i] = 'a';
result[250] = 0;

现在再次运行你的代码,你会发现你的输出结尾有很多'a'字符,直到你得到字符250.那就是你会看到:

“XYXYCS280ISAWXYSOMXYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”

如果你想自己弄清楚其余部分,请立即停止阅读。


问题是你没有显式null终止你的字符串。

请注意,替换S的最后一个字符不是问题,而是使用while循环的终端条件。由于您没有手动复制S中的'\ 0'字符,因此您希望结果数组中包含'\ 0'字符,C和C ++不保证这些字符。

只需将以下行添加到substituteChar函数的末尾即可解决问题:

*R = '\0';

答案 1 :(得分:0)

这适合吗?

#include<stdio.h>
int main () {
    const char* S = "EECS280ISAWESOME";
    const char* P = "XY";
    char result[256];
    while(*S)
    {
        if(*S=='E') 
            printf("XY");
        else 
            printf("%c", *S);
        S++;
    }
} 

答案 2 :(得分:0)

您的代码完全正确并且出现小错误。有一个字符串,永远的事实   string应该以null字符终止。所以只需添加* R ='\ 0';在......的最后   而功能和这个算法完美地工作。