字符串打印

时间:2018-05-01 18:48:15

标签: c string

我正在尝试将此字符串打印出单个名称。它不是一次打印一个名称,而是打印出所有名称。有人能告诉我我做错了什么吗?提前谢谢。

#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;
}

2 个答案:

答案 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;
}