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语言的新手。
答案 0 :(得分:2)
打印输出的原因是编译器将a
和b
视为整数数组,因为您尚未指定类型。较旧的编译器会让你离开它并将类型默认为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)
问题是您已将a
和b
声明为int
数组,但您将它们用作char
数组。这个应该给你一个编译器的警告(总是在你的编译器上使用-Wall或等价物并注意警告)。
修复很简单;将它们声明为char
:
char a[80000], b[40000];