我想切断* 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
答案 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);
}
不要忘记增加阵列大小!