如何在函数内部修改字符数组?

时间:2019-01-02 10:17:37

标签: c++ arrays char pass-by-reference pass-by-value

我想通过反转字符数组来更新它。在函数内部输出时,字符数组正确,但在函数调用后在main中输出字符数组。

我相信字符数组是通过引用传递的,但是在更新数组时,不会更新main函数中的字符数组。我在这里做什么错了?

#include <iostream>
#include <cstring>
using namespace std;

void StringReverse(char *ch, int size){
    char sh[100] = {0};
    for(int i=0 ; i<size ; i++){
        sh[i] = ch[size-1-i];
    }
    sh[size] = '\0';
    ch = sh;
    cout<<ch<<endl;
}

int main(){
    char ch[100];
    cin.getline(ch, 100);
    int size = strlen(ch);
    StringReverse(ch,size);
    cout<<ch;
}

我不想在函数内部打印结果,而是通过调用函数mainStringReverse函数中更新字符数组'ch'。

2 个答案:

答案 0 :(得分:0)

您要使用strncpy()而不是ch = sh;。正如其他人所指出的那样,您未在修改ch。您仅在修改局部变量sh

#include <iostream>
#include <cstring>
using namespace std;

void StringReverse(char *ch, int size){
    char sh[100] = {0};
    for(int i=0 ; i<size ; i++){
        sh[i] = ch[size-1-i];
    }
    sh[size] = '\0';
    strncpy(ch, sh, 100);
    cout<<ch<<endl;
}

int main(){
    char ch[100];
    cin.getline(ch, 100);
    int size = strlen(ch);
    StringReverse(ch,size);
    cout<<ch;
}

答案 1 :(得分:0)

ch函数中的StringReverse在该函数中是本地的。这就是为什么分配ch = sh;时,它不会更改ch中的main的原因。 虽然您可以复制sh,但是更好的方法是使用反向就地,这样就根本不需要本地副本。

例如:

void StringReverse(char *ch, int size){
    for(int i = 0, j= size - 1 ; i < j ; i++, j--){
        int t = ch[i];
        ch[i] = ch[j];
        ch[j] = t;
    }
    cout << ch << endl;
}

如果您使用std::string而不是普通的char数组,则这样做会容易得多。例如,您可以使用std::reverse