C++函数中传进去一个指针实参,怎么样使这个指针在函数结束后发生了改变?(注,函数的返回类型是其他)

发布于 2022-09-02 09:02:25 字数 549 浏览 16 评论 0

int find_replace_str(char str[],const char find_str[],const char replace_str[])
{
    //别的操作
    char *newStr=new char[newLength+1];
   //对newStr的操作
    str = newStr;
    return count;
}

int main()
{
    char *str="abceeeabceeeeabceeeeabceeeeeabc";
    const char *find_str="abc";
    const char *replace_str="ABCD";

    cout<<find_replace_str(str,find_str,replace_str)<<" "<<str<<endl;
    cin.get();
    return 0;
}

main函数中的str还是之前的str,请教大神如何解决
我知道传递引用或者二级指针可以,但是这是南京大学复试的题目,函数名就是这么写的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浅浅 2022-09-09 09:02:25

程序中有两处问题:

int find_replace_str(char str[],const char find_str[],const char replace_str[])
{
    //别的操作
    char *newStr=new char[newLength+1];   // <--+
    //对 newStr 的操作                    //  <--+- (1) 此处不应新分配内存,而应直接在参数数组 str 中进行修改
    str = newStr;                        //  <--+
    return count;
}

int main()
{
    //char *str="abceeeabceeeeabceeeeabceeeeeabc";
    // (2) 此处应该使用字符数组,而不是使用非常量(nonconst)指针。
    // 定义一个字符数组会分配内存空间,然后使用拷贝(或移动)构造函数将右侧的字符串常量拷贝(或移动)到左侧的数组中。
    // 定义一个字符指针不会分配内存空间,它直接指向常量字符串所在的内存空间。
    char str[100] = "abceeeabceeeeabceeeeabceeeeeabc";
    const char *find_str="abc";
    const char *replace_str="ABCD";

    cout<<find_replace_str(str,find_str,replace_str)<<" "<<str<<endl;
    cin.get();
    return 0;
}

所以,可以通过参数strmain中分配的数组传递到函数find_replace_str中,而函数find_replace_str再对这个数组进行修改替换,从而影响到main中分配的数组的内容。


另外,(2)处将一个常量字符串赋值给非常量指针是错误的,一个常量字符串只能赋值给常量指针或字符数组。否则的话,就有可能通过非常量指针修改字符串。

  char *a = "abc";        // 错误
  a[1] = 'd';             // 错误,尝试写入常量内存

  const char *b = "abc";  // 正确,不能通过 b 修改常量字符串

  char c[] = "abc";       // 正确,将常量字符串复制到字符数组中
  c[1] = 'd';             // 正确,修改发生在数组中
瞳孔里扚悲伤 2022-09-09 09:02:25

函数名字的意思很明显,针对字符数组操作,替换掉需要替换的子串
main函数是你写的吧,这样用是不对的,字符串是const char *,不能改变的,你需要声明数组

char str[128] = "..."; 

这样子,在find_replace_str里面

 ...
{
    if (找到符合的子串) {
        替换掉需要替换的子串,比如 "ori" => "des";
        //假设 replace_str[] = "des"; 
        char *p = replace_str;
        while (*p) { // 这里 不一定对,因为两遍的串可能不是等长的,只是示例
            str[index ++] = *p++;
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文