C ++为什么这个程序不提供任何输出?

时间:2014-01-17 09:30:49

标签: c++

我的代码:

void simple();
/*
 * Write a function that has this prototype
 *         int replace(char * str, char c1, char c2);
 * Have the function replace every occurrence of c1 in the string str with c2, and
 * have the function return the number of replacements it makes.
 */
int replace(char * str, char c1, char c2);

cSeven::cSeven() {

}

cSeven::~cSeven() {

}

void cSeven::show() {
    exes();
}

void cSeven::exes() {
    char * ch = "acbcccdc";
    int occ = replace(ch, 'c', 'b');
    cout << occ;
}

int replace(char * str, char c1, char c2) {
    int cc = 0;
    while (*str) {
        if (*str == c1) {
            cout<<*str<<endl;
            *str = c2;
            cout<<*str<<endl;
            cc++;
        }
        str++;
    }
    return cc;
}

程序停在“* str = c2;”,我看不出它有什么问题。有人能说清楚吗?感谢

2 个答案:

答案 0 :(得分:1)

您正在尝试修改字符串文字。你不被允许这样做。
你的编译器应该警告你关于这行

char * ch = "acbcccdc";

如果没有,则需要提高警告级别

替换该行
char ch[] = "acbcccdc";

所以你要改变字符串的可变副本。

答案 1 :(得分:1)

你在这里声明了一个C风格的字符串:

char * ch = "acbcccdc";

作为参数传递给replace函数。在其中,您尝试从行中的字符串修改字符:

*str = c2;

也是程序停止的地方。

标准在第2.14.5 / 12节中明确规定:

  

尝试修改字符串文字的效果未定义。

因此,您的程序行为未定义

由于您使用的是C ++,而不是C,我建议使用std::string代替。有了它你就可以避免这个以及许多其他问题。更不用说大多数代码看起来更干净了。只需查看std::string函数的replace对应部分:

int replace(std::string& str, char c1, char c2) {
    int cc = std::count(str.begin(), str.end(), c1);
    std::replace(str.begin(), str.end(), c1, c2);
    return cc;
}