String 使用strcat()函数后打印数组的特定字符时出现问题
假设我输入a=“洛德”和b=“伏地魔”(不带引号),并将两个字符串连接起来,形成“洛德”。 然后,我想打印连接字符串的前3个字符。因此,在我的选择中,输出结果应该是“LOR”(连接字符串的前3个字符),另一方面,我的编译器显示的结果是“LVE”。 我错在哪里?String 使用strcat()函数后打印数组的特定字符时出现问题,string,arrays,c,String,Arrays,C,假设我输入a=“洛德”和b=“伏地魔”(不带引号),并将两个字符串连接起来,形成“洛德”。 然后,我想打印连接字符串的前3个字符。因此,在我的选择中,输出结果应该是“LOR”(连接字符串的前3个字符),另一方面,我的编译器显示的结果是“LVE”。 我错在哪里? 我不熟悉C语言。问题是,您将a和b声明为int数组,但将它们用作char数组。这应该会给你一个来自你的编译器的警告(总是在你的编译器上使用-Wall或者类似的东西,并注意这些警告) 解决方法很简单;将它们声明为char: a[80
我不熟悉C语言。问题是,您将
a
和b
声明为int
数组,但将它们用作char
数组。这应该会给你一个来自你的编译器的警告(总是在你的编译器上使用-Wall或者类似的东西,并注意这些警告)
解决方法很简单;将它们声明为char
:
a[80000], b[40000];
scanf("%s %s", a, b);
strcat(a,b);
printf("%c%c%c", a[0], a[1], a[2]);
问题是您将
a
和b
声明为int
数组,但将它们用作char
数组。这应该会给你一个来自你的编译器的警告(总是在你的编译器上使用-Wall或者类似的东西,并注意这些警告)
解决方法很简单;将它们声明为char
:
a[80000], b[40000];
scanf("%s %s", a, b);
strcat(a,b);
printf("%c%c%c", a[0], a[1], a[2]);
打印输出的原因是编译器将
a
和b
视为整数数组,因为您尚未指定类型。较旧的编译器会让您放弃它,并将类型默认为int
所以你有效地声明了inta[80000];int b[40000]
要使程序按预期工作,应使用char
类型声明它们:
char a[80000], b[40000];
现在解释一下您的“LVE”输出。这其实是很合乎逻辑的。
您必须了解数组a
在内存中的位置:
char a[80000], b[40000];
解释如下:
a
的每个元素都是一个int
,它在内存中占用4个字节。您使用字符(您的字母)初始化了ints
。每int
消耗4个字符
由于您不是将a[0]
打印为int
,而是使用%c
,因此printf
只取a[0]
中的第一个字节,然后打印L
a[1]
在内存中从V
开始,因此V
将被打印
a[2]
从E
在内存中启动,因此E
将被打印
我希望它能有所帮助。打印输出的原因是编译器将a
和b
视为整数数组,因为您没有指定类型。较旧的编译器会让您放弃它,并将类型默认为int
所以你有效地声明了inta[80000];int b[40000]
要使程序按预期工作,应使用char
类型声明它们:
char a[80000], b[40000];
现在解释一下您的“LVE”输出。这其实是很合乎逻辑的。
您必须了解数组a
在内存中的位置:
char a[80000], b[40000];
解释如下:
a
的每个元素都是一个int
,它在内存中占用4个字节。您使用字符(您的字母)初始化了ints
。每int
消耗4个字符
由于您不是将a[0]
打印为int
,而是使用%c
,因此printf
只取a[0]
中的第一个字节,然后打印L
a[1]
在内存中从V
开始,因此V
将被打印
a[2]
从E
在内存中启动,因此E
将被打印
希望有帮助。什么类型的a
和b
int
?声明a
和b
为字符a、b代码>您的第一行不是有效的C,这不是一个。@usr2564301:它在C中完全有效,只是过时了。好吧,我的C编译器立即拒绝了它–当显式声明它为int
时,它会抛出许多额外的错误(一些不兼容的指针类型).什么类型是a
和b
int
?声明a
和b
为字符a、b代码>您的第一行不是有效的C,这不是一个。@usr2564301:它在C中完全有效,只是过时了。好吧,我的C编译器立即拒绝了它–当显式声明它为int
时,它会抛出许多额外的错误(一些不兼容的指针类型)。您是否应该明确声明中缺少的类型使其默认为int
?(并且只有在足够旧的编译器中才不会将其标记为错误…)您是否应该确定声明中缺少的类型使其默认为int
?(只有在足够旧的编译器中才不会将其标记为错误…)