我正在尝试将此字符串打印出单个名称。它不是一次打印一个名称,而是打印出所有名称。有人能告诉我我做错了什么吗?提前谢谢。
#include <stdio.h>
#define NUM_OF_NAMES 8
#define NAME_SIZE 3
void printNames(char names[][NAME_SIZE], int size);
int main()
{
char nameList[NUM_OF_NAMES][NAME_SIZE] = {"Bob",
"Sue",
"Jak",
"Rod",
"Jon",
"Ash",
"Deb",
"Kay"};
printf("\n\n\nLIST\n");
printNames(nameList, NUM_OF_NAMES);
}
void printNames(char names[][NAME_SIZE], int size)
{
for(int index = 0; index < size; index++)
{
printf("%4s\n", names[index]);
}
return;
}
答案 0 :(得分:3)
程序将所有名称打印在一起的原因是各个三字符名称不以空值终止。 printf
尝试打印第一个名称,找不到null终止符,进入下一个名称,然后是下一个名称,依此类推。最后,这是未定义的行为,因为整个数组的最终空终止不存在。
发生此问题是因为NAME_SIZE
太小 - 它不适用于null终止符。
通过更改NAME_SIZE
:
#define NAME_SIZE 4
启用警告并将其视为错误将有助于您将来避免此问题。
答案 1 :(得分:2)
首先,在char nameList[NUM_OF_NAMES][NAME_SIZE]
中,您已将NAME_SIZE
定义为3,并且您正在将3 char
存储到其中,因此'\0'
null终止符没有保留内存空间,因为char缓冲区应该以null结尾。要避免此问题,请增加NAME_SIZE
。例如
#define NAME_SIZE 4
其次,从main()
传递2D数组nameList
,你必须抓住指向像char (*names)[NAME_SIZE]
这样的数组的指针而不是像你那样用2D数组。
这是修改后的代码
#define NUM_OF_NAMES 8
#define NAME_SIZE 4
void printNames(char (*names)[NAME_SIZE], int size) { /*catch with pointer to an array of NAME_SIZE char */
for(int index = 0; index < size; index++) {
printf("%4s\n", names[index]);
}
}
int main(void ){
char nameList[NUM_OF_NAMES][NAME_SIZE] = {"Bob",
"Sue",
"Jak",
"Rod",
"Jon",
"Ash",
"Deb",
"Kay"};
printf("\n\n\nLIST\n");
printNames(nameList, NUM_OF_NAMES);
return 0;
}