将数组作为参数传递给函数

时间:2013-12-10 21:42:16

标签: c++ arrays

该脚本应该输出用户输入到数组“store”中的数组值。我试图将所有char数组值存储到字符串temp中。我在第12行得到错误:“[错误]从'char *'无效转换为'char'[-fpermissive]。”非常感谢任何帮助!

编辑:所以我修改了声明,现在至少它编译了,但我得到的cmd上的答案都是混乱的。为什么会这样? cmd只能正确地判断第一个字符串,但在空格之后,它会混乱。

#include <iostream>
#include <cstdlib>

using namespace std;
void coutArray(char[], int);
int main()
{
    char store[50];

    cout << "enter text: " << endl;
    cin >> store;
    coutArray(store, 50);

    system("pause");
    return 0;

}
void coutArray(char store[], int max)
{
    string temp = "";
    int i = 0;
    while (i < max)
    {
        temp += store[i];
        i++; 
    }
    cout << temp << endl;
}

使用来自所有回答者的输入我终于得到了固定代码:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;
void coutArray(char[], int);
int main()
{
    char store[50] = {0};

    cout << "enter text: " << endl;
    cin.getline(store, 50);
    coutArray(store, 50);

    system("pause");
    return 0;

}
void coutArray(char store[], int max)
{
    string temp = "";
    int i = 0;
    while (i < max && store[i]!=0)
    {
        temp += store[i];
        i++; 
    }
    cout << temp << endl;
}

谢谢大家。我学到了很多东西!!!

5 个答案:

答案 0 :(得分:1)

当您使用“cin”获得输入时,您的输入将自动以0(NULL)结束。 您只需要在while语句中添加一小段代码。

而不是:

while (i < max)

使用它:

while (i < max && store[i]!=0)

现在它将在输入字符串完成时停止,并且不会预先打印数组中存在的任何垃圾。

为了表明cin确实添加终止零,我将数组初始化为46,并在cin之后放置一个断点

enter image description here

答案 1 :(得分:0)

该功能的声明是错误的。应该是void coutArray(char *,int); 查看Implicit Conversion规则,了解编译器可以执行的操作以及无法为您执行的操作。

答案 2 :(得分:0)

  

所以我修改了声明,现在至少它编译了,但我得到的cmd上的答案都是混乱的。为什么会这样?

不确定你的意思是乱七八糟。但既然你没有告诉我们你输入的内容很难知道它看起来对我有用:

> ./a.out
enter text:
Plop
Plop�ȏU�

请注意,因为我的输入只有4个字符。这意味着数组中的很多字符仍然具有未定义(即随机值)。这就是我看到垃圾的原因。为了解决这个问题,请将数组初始化为全0值。

char store[50] = {0};

即使bettern使用C ++对象也不会处理更长的字符串。

std::string store;
std::getline(std::cin, store);

注意:按值传递数组到函数不是一个好主意。另一方面,它们已经衰减为指针,因此不再像数组一样(它们的行为类似指针,其语义相似但不完全相同)。

如果必须传递数组,请通过引用传递它。但我会使用C ++容器并通过引用传递它(它比使用C构造更安全)。看看std::string

答案 3 :(得分:0)

您的程序存在的问题是您输入的字符数可能少于缓冲区的最大大小。然后,当您将最大尺寸作为参数传递给coutArray时,您已将char数组中未填充的广告位分配给temp。这些未填充的插槽可以包含任何内容,因为到目前为止还没有填充它们。

您的程序仍然正确,但更好的方法是使用read,以便您指定的字节数是可以输入的最小字节数:

std::cin.read(store, 50);

更好的解决方案是使用std::string

std::string store;
std::cin >> store;

// or for the entire line
std::getline(std::cin, store);

此后,您的coutArray应更改为:

void coutArray(std::string);
// ...
void coutArray(std::string str)
{
    std::cout << str << std::endl;
}

答案 4 :(得分:0)

看看这种方式

template<typename T, size_t N>
void MyMethod(T (&myArray)[N])
{
    //N is number of elements, myArray is the array
    std::cout<<"array elements number = "<<N<<endl;

    //put your code
    string temp;
    temp.resize(N+1);//this is for performance not to copy it each time you use += operator
    int i = 0;
    while (i < max)
    {
        temp += store[i];
        i++; 
    }
    cout << temp << endl;
}
//call it like this
char arr[] = "hello world";
MyMethod(arr);