C ++将值传递给函数中的二维字符数组
Posted
技术标签:
【中文标题】C ++将值传递给函数中的二维字符数组【英文标题】:C++ Passing values to 2D char array in a function 【发布时间】:2015-04-22 20:05:50 【问题描述】:我正在尝试使用一个函数来对一个充满单词的 char 数组进行排序。我目前遇到的问题是,在我的 sortNames 函数中,我得到了错误,“表达式必须是可修改的左值”在下面的部分
hold = nameArr[ii];
nameArr[ii] = nameArr[jj];
nameArr[jj] = hold;
我猜这是因为我出于某种原因试图通过数组传递值。我正在努力理解引用和指针等,我想这也伤害了我。对此的任何帮助都会很棒,在此先感谢您。
这是我当前的代码...
#include <iostream>
#include <string>
using namespace std;
char nameArr[20][15]; // array to store the 20 values
int val = 0; // variable to pass values to the array
int x = 0; // loop counter outside functions
//Function prototypes
void getNames(char (&nameArr)[20][15], int &val);
void sortNames( char(&nameArr)[20][15]);
//getNames Function
void getNames(char (&nameArr)[20][15], int &val)
int i = 0; // loop counter
cout << "Awesome, now lets input those names...\n" << endl;
for (i = 0; i < val; i++)
cout << "\nNAME " << i+1 << ": " << ' ';
cin >> nameArr[i];
cout << "\n\n\nThese are the names that you inserted:\n" << endl;
for (i = 0; i < val; i++)
cout << nameArr[i] << "\n" << endl;
// sortNames function
void sortNames( char(&nameArr)[20][15])
int n = 15; // max length of word
int ii = 0; // loop counter
int jj = 0; // other counter
string hold; // holding array
for (int ii = 0 ; ii < n ; ii++)
for (int jj = ii + 1; jj < n; jj++)
if (nameArr[ii] > nameArr[jj])
hold = nameArr[ii];
nameArr[ii] = nameArr[jj];
nameArr[jj] = hold;
int main()
cout << "NAME SORTER!\n\nPlease enter in the amount of names you wish to enter: " << ' ';
cin >> val;
getNames(nameArr, val);
cout << "\n\n\nAlright, lets sort now..." << endl;
sortNames(nameArr);
cout << "\nHere are the results:\n" << endl;
for (x = 0; x < val; x++)
cout << nameArr[x] << "\n" << endl;
system("pause");
【问题讨论】:
您使用二维字符数组而不是字符串向量是否有原因? 是的,很遗憾,此作业需要满足 这不是一个非常 C++ 的作业,是吗? 也许这对你有帮助,尤其是第一个答案:***.com/questions/4118732/… 【参考方案1】:您的主要问题是您试图在两个固定大小的数组上使用赋值运算符,这是不合法的。考虑以下代码:
int a[2] = 0, 0;
int b[2] = 1, 1;
a = b;
这会产生与您遇到的相同的错误。在您提到的行中,您对 char[15]
数组做同样的事情。
要解决您的问题,您需要动态分配 char
数组/使用指针,或者更简单的解决方案是将您的 char[][]
数组更改为 string[]
数组。
话虽如此,你可以在这里清理很多东西:
您有一些全局声明的变量只能在 main 或 lower 中定义 您可以在for
循环中声明循环计数器,而不是像在 sortNames
函数中那样预先声明循环计数器
在 sortNames
中,您两次声明了一些变量
【讨论】:
我试图理解这一点,但遇到了一些麻烦。数组都是固定大小且大小相同,我明白了。但我不明白的是,如果你分配 a = b,如果它们是相同的固定大小,为什么它不起作用?原谅我的无知,还在学习中。 @Dpry12 ***.com/questions/3437110/…【参考方案2】:我将在 dwcanilla 的回答中添加一些内容。
您需要将函数原型和标头更改为类似以下内容:
void getNames(char ** & arr, int val);
void sortNames(char ** & arr);
这意味着函数接受对 c 字符串数组的引用;也就是说,当您在函数中使用数组时,您正在修改您传递的实际数组,而不仅仅是一个副本。此外,我认为您只需将整数按值传递给 getNames 就可以了。
其次,全局变量通常是个坏主意。由于您可以将数组引用直接传递给您的函数,您可能需要在 main 中声明 nameArr 和其他全局变量。
第三,在 getNames 中,您将无法使用 cin 直接分配您的 c 字符串。
编辑:这是一个更好的方法—— getting console input for Cstrings
最后,strcmp()(并确保包含 cstring 标头):
if(strcmp(arr[ii], arr[jj]) > 0)
【讨论】:
在 arr[i] = temp.c_str() 处出现错误;部分,说“Const char *”不能分配给“char *”类型的实体......另一个我不明白的错误lol 嗯,抱歉,我的建议是错误的。试试这个,而不是从用户那里获取字符串:***.com/questions/9755100/…以上是关于C ++将值传递给函数中的二维字符数组的主要内容,如果未能解决你的问题,请参考以下文章