c - 字符串打印

标签 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;
}

最佳答案

程序将所有名称打印在一起的原因是各个三字符名称不是以 null 结尾的。 printf 尝试打印名字,没有找到空终止符,进入下一个名字,然后是下一个,依此类推。最后,这是未定义的行为,因为整个数组的最终空终止不存在。

发生此问题是因为 NAME_SIZE 太小 - 它不适合空终止符。

通过更改 NAME_SIZE 来解决这个问题:

#define NAME_SIZE 4

启用警告并将它们视为错误将帮助您避免将来出现此问题。

关于c - 字符串打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50122110/

相关文章:

c - 具有相同名称的全局和局部变量,意外值

c - 如何在C中创建没有缓冲区的管道?

java - 随机句子生成器返回数字而不是句子

c - 用制表符替换空格

无符号整数和有符号整数的比较运算

c - 使用系统 ("/bin/stty raw"时的奇怪输出行为)

swift - 在字符串中插入一个字符(Swift)

java - 格式字符串变为 xxx1、xx10 或 1###、10## 等

c++ - 初始化无法从const char [3]转换为std::string *

自定义内存区域的 c malloc 功能