Как изменить массивы символов внутри функций? - PullRequest
0 голосов
/ 02 января 2019

Я хочу обновить массив символов, перевернув его.Массив символов корректен при выводе внутри функции, но не в 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;
}

Я не хочу печатать результат внутри функции, но обновляю массив символов 'ch' в функции main, вызывая функцию StringReverse.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Функция ch in 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.

0 голосов
/ 02 января 2019

Вы хотите использовать 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;
}
...