如果我有如下程序:
int main(int argc, char** argv) {
char s[32] = argv[1];
printf("entered char is %s\n", s);
}
为什么会出现错误:在编译期间,数组初始值设定项必须是初始化列表或字符串文字?
不是argv [1]一个字符串并且不是合法的
char s[32] = "A test string"
答案 0 :(得分:4)
您无法使用类似指针初始化数组。相反,你必须在声明后复制字符串:
for a, b in itertools.product(noun, adj):
print('The', a, b)
请注意,在执行此操作之前,您应该检查是否至少提供了一个参数(通过选中char s[32];
strcpy(s, argv[1]);
)。另请注意,除非您要修改参数中提供的字符串,否则实际上不需要保留字符串的第二个副本。
哦,您可能希望使用argc
而不是普通strncpy
,以避免可能的缓冲区溢出情况。请记住,如果源为long,strcpy
将不会终止字符串,因此您需要明确地执行此操作。
答案 1 :(得分:1)
表达式strncpy
会导致错误,因为通过执行char s[32] = argv[1];
您尝试更改s=argv[1]
的基址,这是不可能的,因为s
是常量指针。
使用s
将strcpy()
复制到argv[1]
s
答案 2 :(得分:1)
提出这样的问题意味着 - 您不了解某些规则。在C中,有几种可能的方法可以初始化数组。当编译器看到它违反规则时,编译器会告诉你。它说它必须是字符串文字或初始化列表。你提供的那个不是这个。它只是一个指针,你不能通过将它放在=
赋值运算符的右侧来初始化数组。
char s[]="hello";
char s[]={'h','e','\0'};
如上所示选择一个。首先是使用文字和第二个使用初始化列表。在你的情况下,你不能使用任何这些 - 这是什么方式? strcpy
救你。在您使用之前,其他答案显示确保缓冲区足够大以容纳您复制的内容。