#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数组的大小就不能声明字符串变量? 当提到数组的大小时,相同的代码工作正常。
答案 0 :(得分:1)
为了使first
和last
在您的上下文中可用,它们需要有一个完整的类型,这是一种在编译时已知大小的类型。
因此,您可以手动指定数组维度(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字符。
然后你可以像使用数组一样使用它。