将数组作为字符串打印返回结尾的奇怪字符

时间:2018-01-26 13:05:51

标签: c arrays string

我想切断* argv []的前两个字符并将它们存储在一个数组中。

int main (int argc, char *argv[])
{
    char salt[2] = {argv[1][0], argv[1][1]};
    printf("%s\n",salt);
}

编译完成后,当我在终端上输入./program_name asdf来运行这个程序时,我期待" asdf"以* argv []传入。因此,我希望该程序能够打印出#34; as"。然而,实际发生的是它会打印出#34; as",然后是相同的随机字符。以下是最近几次出现的内容:

灰。
asX
asKs
as8 \ 8

3 个答案:

答案 0 :(得分:8)

字符串在C中基本上是以空字符结尾的字符序列。在您的数组中只有两个非空字符,因此当您尝试将其作为字符串打印时,其结尾是不确定的。这会导致未定义的行为

如果要从字符数组构造字符串,请将数组的大小扩展为1,并在末尾添加空字符:

char salt[3] = {argv[1][0], argv[1][1], '\0'};
//        ^ Extend                      ~~~~ Terminate

答案 1 :(得分:3)

char salt[2] = {argv[1][0], argv[1][1]};

你没有留下足够的空间用于终止NUL字符,因此它会一直读取,直到它在内存中找到下一个NUL(这是未定义的行为,如果找不到NUL,最终会与SIGSEGV崩溃)。

你可以做

char salt[] = {argv[1][0], argv[1][1], 0};

然后像你一样继续,或者你做

printf("%c%c\n", argv[1][0], argv[1][1]);

答案 2 :(得分:2)

通过将未终止的char数组传递给期望空终止数组的函数printf()来调用未定义的行为。因此,您必须存储'\0'字符,如下所示:

int main (int argc, char *argv[])
{
    char salt[3] = {argv[1][0], argv[1][1], '\0'};
    printf("%s\n",salt);
}

不要忘记增加阵列大小!