请帮助我了解使用char line[80]="1:2"
等初始化字符数组(不起作用!!)和使用char line[80]
后跟strcpy(line,"1:2")
的字符数组的区别。
根据我在第一种情况下的理解,我有一个charachter数组,它已被分配内存,我正在复制一个字符串文字。在第二种情况下也是如此。但显然我错了。所以我的理解有什么不妥。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void tokenize(char* line)
{
char* cmd = strtok(line,":");
while (cmd != NULL)
{
printf ("%s\n",cmd);
cmd = strtok(NULL, ":");
}
}
int main(){
char line[80]; //char line[80]="1:2" won't work
/*
char *line;
line = malloc(80*sizeof(char));
strcpy(line,"1:2");
*/
strcpy(line,"1:2");
tokenize(line);
return 0;
}
答案 0 :(得分:3)
你错了。这两个代码片段的结果
char line[80] = "1:2";
和
char line[80];
strcpy( line, "1:2" );
是一样的。这就是这句话
char line[80] = "1:2";
确实有用。:)
只有一个区别。当数组由字符串文字初始化时,不会有字符串文字的相应初始化字符的数组的所有元素将由'\0'
初始化,即它们将被零初始化。当使用函数strcpy
时,未被字符串文字字符覆盖的数组元素将具有未终止的值。
数组由字符串文字初始化(除了&#34; tail&#34;的零初始化除外),就像应用函数strcpy
一样。
这些陈述之间存在结果的确切等价
char line[80] = "1:2";
和
char line[80];
strncpy( line, "1:2", sizeof( line ) );
当您使用函数strncpy
并指定目标数组的大小时。
如果你的意思是直接将函数tokenize
作为函数的参数传递给函数{{1}},那么程序会有未定义的行为,因为你可能不会改变字符串文字。
根据C标准(6.4.5字符串文字)
7未指明这些阵列是否与它们不同 元素具有适当的值。 如果程序尝试 修改这样的数组,行为是未定义的。