我有一个char
数组声明为
char userName[20][35];
我认为应该是每个35个字符的20个缓冲区。
所以现在我尝试将它发送到一个函数:
readNames(userName[20][35])
{
}
我尝试了几种不同的方法,是通过数组的正确方法吗?现在我需要分配一个我从用户输入中读出的值。
strcpy(userName[numberOfUsers] , userInput);
这两部分,我是否将数组发送到函数ok?我如何做strcpy
?它似乎不起作用。
答案 0 :(得分:2)
您可以通过多种方式完成此操作。为安全起见,您应该添加一个大小限制参数,以便被调用者(您的函数)知道主导维度有多大:
void readNames(char names[][35], size_t n)
{
// your code here using names[0] through names[n-1]
}
并称为:
char names[20][35];
readNames(names, sizeof(names)/sizeof(*names));
同样,这也有效(实际上与上述同义):
void readNames(char (*names)[35], size_t n)
{
// your code here using names[0] through names[n-1]
}
两者都有效,但如果你真的想坚持使用C风格的数组,那么使用C ++会有更好的方法。 (稍后显示)。
最后,这个:
strcpy(userName[numberOfUsers] , userInput);
是正确的语法。只需确保记住numberOfUsers
不能超过或符合数组的边界(您在上述示例中从调用方传递的size_t n
)。寻址就像C一样,零基于(n-1)
。
使用模板扣除确定阵列尺寸
使用C ++执行此操作的很多更强大的机制涉及使用模板推导来确保函数知道维度。它更加灵活,因为它可以与不同的数组声明一起使用:#include <iostream>
template<size_t N, size_t M>
void readNames(char (&names)[N][M])
{
// use names[0]... names[N-1], where
// each is a char [0..M-1] buffer.
std::cout << __PRETTY_FUNCTION__ << '\n';
}
int main()
{
char shortnames[20][30];
readNames(shortnames);
char longnames[50][100];
readNames(longnames);
return 0;
}
<强>输出强>
void readNames(char (&)[N][M]) [N = 20, M = 30]
void readNames(char (&)[N][M]) [N = 50, M = 100]
标准图书馆怎么样?嗯?
如果你真的想要做到这一点,那就把自己搞得一团糟,但说实话,我们已经进入了新千年的十年之久。停止使用80年代和90年代的技术:
std::vector<std::string> readNames()
{
std::vector<std::string> res;
while (some-condition)
{
// get name here
std::string name;
//add to result
res.push_back(name);
}
return res;
}
像这样调用:
std::vector<std::string> names = readNames();
答案 1 :(得分:0)
您选择的语法是函数原型,而不是调用。每个都是用不同的方式写的。
使用该数组调用readnames:
readNames (userName);
声明功能:
void readNames (char names[20][35])
{
... manipulate names here ...
}
如果函数返回值,则将void
更改为其他类型。
答案 2 :(得分:0)
void getinput(char names[][10], int s)
{
int j;
cout << "enter value ";
for (int i = 0; i < s; i++)
{
j = 0;
while (**condition**)\\what will be here,this condition is not working
{
cin >> names[i][j];
j++;
}
}
}