我确定之前已经问过这个问题,但过去2天我一直在寻找并且无法解决这个问题,所以我希望有人会帮助我。
对于我的C赋值,我们应该接收每个函数参数作为指针。传递的值之一是2D char数组,在过去48小时内,我无法在我的书,笔记,教师幻灯片等中找到如何正确执行此操作,并实际使其工作。
void main(){
/*
This is the value being passed. The first dimension has a size of 1000,
to account for 1000 different sorted people. Second dimension is an
array that holds the actual name, with a max name length of 25.
*/
char names[1000][25] = {'\0'};
read_files(names);
}
void read_files(char* names){
char newName1[4] = "mary";
char newName2[4] = "anna";
for(int i = 0; i < 5; i++){
names[0][i] = newName1[i];
}
for(int i = 0; i < 5; i++){
names[1][i] = newName2[i];
}
}
基本上,我试图让names[0][x]
拥有x = "mary"
,names[1][x]
拥有x = "anna"
。
(或者,更确切地说,names[0][0]= 'm'
,names[0][1]= 'a'
等。)
不幸的是我无法通过。我得到的最接近的是让它为名字指定一个名称,但不再是。
任何帮助都会很棒。实际上有很多我正在和他们一起工作的同学都对此感到难过。我确信对于有经验的人来说很容易,但是我们还没有得到如何做到的好的指导,我找不到很多解决这个问题的具体例子。
正如我所说,我们的教师特别希望函数参数成为指针。
修改
到目前为止,很好的信息,我非常接近这些例子中的一些。我会给他们一个机会,看看有什么用。
答案 0 :(得分:1)
您必须将read_files
定义为:
void read_files(char (*names)[25]) {
char newName1[5] = "mary";
char newName2[5] = "anna";
for(int i = 0; i < 5; i++){
names[0][i] = newName1[i];
}
for(int i = 0; i < 5; i++){
names[1][i] = newName2[i];
}
}
因为您需要将指针传递给char[25]
数组。一个两个
维数组不能转换为双指针或单指针。
另请注意,newName1
和newName2
必须是可容纳5个元素的数组。在C a
string是以'\0'
- 终止字节结尾的字符序列。
这意味着对于长度为n
的字符串,您需要一个char
长度数组
n+1
,因为你需要'\0'
的额外字节 - 终止字节。
复制字符串的更好方法是strcpy
或strncpy
。 strncpy
是
比strcpy
更安全,因为您限制了要复制的字节数
避免缓冲区溢出。但是strncpy
可能不会写'\0'
- 终止字节
如果没有足够的空间。
而不是:
for(int i = 0; i < 5; i++){
names[0][i] = newName1[i];
}
使用它:
strcpy(names[0], newName1);
或strncpy
方式:
strncpy(names[0], newName1, sizeof names[0]);
names[0][sizeof(names[0]) - 1] = 0; // making sure to add the \0 byte
还要记住,main
函数的正确定义可以是
只有其中一个:
int main(void);
int main(int argc, char **argv);
int main(int argc, char *argv[]);
答案 1 :(得分:0)
#include <stdio.h>
void read_files(char* names){
char newName1[4] = "mary";
char newName2[4] = "anna";
for(int i = 0; i < 5; i++){
names[i] = newName1[i];
}
int offset = 25;
for(int i = 0; i < 5; i++){
names[i + offset] = newName2[i];
}
}
void main(){
/*
This is the value being passed. The first dimension has a size of 1000,
to account for 1000 different sorted people. Second dimension is an
array that holds the actual name, with a max name length of 25.
*/
char names[1000][25] = {'\0'};
read_files(names[0]);
printf("%s %s", names[0], names[1]);
}
在内存中,2d数组仍然是具有花式寻址的1d块。所以你可以有一个偏移变量,只需将它添加到每个名字上就像我在这里做的那样