【问题标题】:How modify character arrays inside functions?如何修改函数内部的字符数组?
【发布时间】:2019-05-28 23:52:16
【问题描述】:

我想通过反转来更新字符数组。函数内部输出字符数组正确,调用函数后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;
}

我不想在函数内部打印结果,而是通过调用函数StringReverse 来更新main 函数中的字符数组“ch”。

【问题讨论】:

  • “我相信字符数组是……”相信是一件危险的事情。我会先测试任何东西并确定它,然后继续相信。
  • 您想使用strncpy() 而不是ch = sh;
  • 更改StringReverse 中指针的副本不会更改指向另一个函数中堆栈变量的指针。即使它有效,您仍然想使用本地堆栈变量,这是一个很大的“不”!只需使用一个字符串。

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


【解决方案1】:

StringReverse 函数中的 ch 是该函数的本地函数。这就是为什么当分配ch = sh; 时,它不会改变main 中的ch。 虽然您可以复制 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

【讨论】:

  • 你可以在一个简单的数组上使用std::reverse,只需使用chch + size作为迭代器。
  • 这是一个更好的解决方案。谢谢:)
  • @sparrow 如果这是一个练习,那么您可能希望实现它而不是使用 C++ 标准库来做所有事情(所以普通数组是可以的)。但你仍然可以寻求更好的算法。
【解决方案2】:

您想使用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;
}

【讨论】:

  • OP 应该改用string
  • @MatthieuBrucher,确实如此。该问题被标记为c++,但他再次使用char arrays 并包括cstring 头文件。这有点两全其美。 :P
  • 是的。我知道使用字符串会更容易。我只是在清理我的概念:P @MatthieuBrucher
  • @sparrow ch实际上是按值传递的,即你是按值传递指针(因为数组衰减到指针),所以StringReverse中的ch实际上是一个拷贝main 函数中的指针 ch。当您执行ch = sh 时,您修改的是ch,即副本,而不是原始chstrncpy 在“指向”数组上工作,这就是为什么它可以工作,因为原始和副本都指向同一个数组。
  • @Holt,根据您的解释删除了我的评论。我不能解释得这么好。
猜你喜欢
  • 2023-01-10
  • 1970-01-01
  • 2015-02-11
  • 2013-11-13
  • 2023-02-04
  • 1970-01-01
  • 2013-02-18
  • 2021-09-24
  • 2021-06-26
相关资源
最近更新 更多