使用strcat()函数后打印数组的特定字符时出现问题

时间:2018-02-20 21:00:48

标签: string arrays c

    a[80000], b[40000];
    scanf("%s %s", a, b);
    strcat(a,b);
    printf("%c%c%c", a[0], a[1], a[2]);

如果我输入 a =" LORD "和 b =" VOLDEMORT " (没有引号),并连接两个字符串,以使" LORDVOLDEMORT "。 然后,我想从连接字符串中打印前3个字符。因此,在我的意见中,输出结果应为" LOR " (连接字符串的前3个字符),另一方面,我的编译器显示的结果是" LVE "。 我哪里错了? 我是C语言的新手。

2 个答案:

答案 0 :(得分:2)

打印输出的原因是编译器将ab视为整数数组,因为您尚未指定类型。较旧的编译器会让你离开它并将类型默认为int

所以你有效地声明了int a[80000]; int b[40000];为了使你的程序按预期工作,你应该用char类型声明它们:

char a[80000], b[40000];

现在解释您的" LVE" 输出。这实际上非常符合逻辑。 您必须了解数组a如何位于内存中:

 LORD VOLD EMOR T\0
 1234 1234 1234 12??
 a[0] a[1] a[2] a[4]

解释如下:

a的每个元素都是int,占用内存中的4个字节。您使用字符(您的字母)初始化ints。每消费int消费一次{&} 4个字符。

由于您未将a[0]打印为int,但使用%c,因此printf仅从a[0]中取出第一个BYTE并打印L }。

a[1]V内存开始,因此会打印V

a[2]E内存开始,因此会打印E

我希望它有所帮助。

答案 1 :(得分:1)

问题是您已将ab声明为int数组,但您将它们用作char数组。这个应该给你一个编译器的警告(总是在你的编译器上使用-Wall或等价物并注意警告)。

修复很简单;将它们声明为char

char a[80000], b[40000];