C字符串设置字符数组到argv [1]

时间:2018-04-28 16:41:08

标签: c string

如果我有如下程序:

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"

3 个答案:

答案 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是常量指针。

使用sstrcpy()复制到argv[1]

s

答案 2 :(得分:1)

提出这样的问题意味着 - 您不了解某些规则。在C中,有几种可能的方法可以初始化数组。当编译器看到它违反规则时,编译器会告诉你。它说它必须是字符串文字或初始化列表。你提供的那个不是这个。它只是一个指针,你不能通过将它放在=赋值运算符的右侧来初始化数组。

char s[]="hello";
char s[]={'h','e','\0'};

如上所示选择一个。首先是使用文字和第二个使用初始化列表。在你的情况下,你不能使用任何这些 - 这是什么方式? strcpy救你。在您使用之前,其他答案显示确保缓冲区足够大以容纳您复制的内容。