【问题标题】:Which is the better way to declare string in C?在 C 中声明字符串的更好方法是什么?
【发布时间】:2021-02-02 07:04:47
【问题描述】:

我是 C 语言的新手,我很好奇在 c 中声明字符串的最佳方式。

例子:

char *name;
//or char name[];

scanf("%s", &name);
printf("Hello %s !", name);

在这种情况下,这两个哪个更好?

char *name;
char name[];

【问题讨论】:

  • 这真的取决于你的用例,你用字符串做什么。
  • 另请注意,最后一个使用[] 是无效的,因为您没有提供尺寸。数组必须有大小,除非在一种特殊情况下 (flexible array member)。
  • 哦,记住,虽然文字字符串不是常量,但它们不能被修改(并且实际上是只读的),这就是为什么如果你想要一个指针,建议使用const char *到文字字符串。
  • 如果您有char *name;,那么scanf("%s", &name) 是错误的,原因有两个:1) %s 说明符需要char * 类型的参数,而@987654330 @ 是 char ** 类型; 2) 一旦 1 固定,则指针 name 未初始化,并且将是空指针(如果定义为全局变量),或者具有不确定(和随机/垃圾)值。

标签: arrays c string variables char


【解决方案1】:

如果你有一个恒定长度的字符串。你可以像这样声明一个 char 数组。

char name[64];


scanf("%s", name); // no more than 63 characters, remember the '\0'
printf("Hello %s\n", name);

如果字符串长度是动态的,请使用函数malloc来分配特定长度的内存。此外,您应该记住释放之前分配的内存。

【讨论】:

  • 您可以强制scanf 不溢出缓冲区,使用格式%63s。
【解决方案2】:

char *name; 是一个指针,它指向字符串第一个索引的地址。如果您通过引用操作变量,这主要用于例如(通过引用传递参数)

char name[] 在 C 中不适用,因为您必须初始化数组大小,例如char name[20];

无论哪种方式,语法正确的后者更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多