搜尋

首頁  >  問答  >  主體

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

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,请教大神如何解决
我知道传递引用或者二级指针可以,但是这是南京大学复试的题目,函数名就是这么写的。

黄舟黄舟2803 天前381

全部回覆(2)我來回復

  • 高洛峰

    高洛峰2017-04-17 13:27:55

    程式中有兩處問題:

    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';             // 正确,修改发生在数组中

    回覆
    0
  • PHPz

    PHPz2017-04-17 13:27:55

    函數名字的意思很明顯,針對字元陣列操作,替換掉需要替換的子字串
    main函數是你寫的吧,這樣用是不對的,字串是const char *,不能改變的,你需要宣告數組

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

    這樣子,在find_replace_str裡面

     ...
    {
        if (找到符合的子串) {
            替换掉需要替换的子串,比如 "ori" => "des";
            //假设 replace_str[] = "des"; 
            char *p = replace_str;
            while (*p) { // 这里 不一定对,因为两遍的串可能不是等长的,只是示例
                str[index ++] = *p++;
            }
        }
    }

    回覆
    0
  • 取消回覆