在c中声明空字符串变量

时间:2016-03-13 19:56:54

标签: c arrays string char

#include <stdio.h>

int main() {
    char prompt1[] = "Enter your first name:", prompt2[] = "Enter your last name:";
    char gratis[] = "Thanks!", first[], last[]; //empty declaration of string varible 

    printf(prompt1);
    scanf("%s", &first);
    printf(prompt2);
    scanf("%s", &last);

    printf("%s\n", gratis);
    printf("Your name is %s %s\n", first, last);
    return (0);
}

为什么不指定char数组的大小就不能声明字符串变量? 当提到数组的大小时,相同的代码工作正常。

screenshot of the error

3 个答案:

答案 0 :(得分:1)

为了使firstlast在您的上下文中可用,它们需要有一个完整的类型,这是一种在编译时已知大小的类型。

因此,您可以手动指定数组维度(first[20]),也可以让编译器从初始化表达式中推断维度(就像您使用prompt1所做的那样)。

如果您不想在编译时指定维度,则需要使用malloc和朋友切换到动态分配的内存。

请注意,您还应该保护自己免受缓冲区溢出的影响:代码中使用的scanf会将未知数量的char读入您提供的缓冲区,从而可以实现溢出。有关如何避免此问题的讨论,请参阅here

答案 1 :(得分:1)

C中的数组在创建时必须知道它们的大小,之后不能更改大小。

因此,您必须为所有阵列指定大小。

只有在提供初始化程序时才能省略大小编号,因为编译器可以从初始化程序计算大小。

在您的代码中,您应该选择足够大的尺寸来存储您期望的内容。你还使用了scanf的错误参数。代码可以是:

char first[100] = { 0 };    // avoid garbage in case input fails
scanf("%99s", first);

如果要允许任意大小的输入,则必须使用动态空间分配。

答案 2 :(得分:-1)

当你创建这样的数组时,它被分配给堆栈,因此你需要在声明中指定它的大小。另一方面,您可以使用指针并稍后分配数组的大小:

C中的数组基本上是指向数组第一个元素的指针。

您可以创建空数组声明

char *first;

之后,您可以使用

定义数组
first = malloc(sizeof(char)*(SIZE_OF_ARRAY+1));

+1因为您需要在字符串末尾放置结尾\ 0字符。

然后你可以像使用数组一样使用它。