该脚本应该输出用户输入到数组“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;
}
谢谢大家。我学到了很多东西!!!
答案 0 :(得分:1)
当您使用“cin”获得输入时,您的输入将自动以0(NULL)结束。 您只需要在while语句中添加一小段代码。
而不是:
while (i < max)
使用它:
while (i < max && store[i]!=0)
现在它将在输入字符串完成时停止,并且不会预先打印数组中存在的任何垃圾。
为了表明cin确实添加终止零,我将数组初始化为46,并在cin之后放置一个断点
答案 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);