Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用strcat()函数后打印数组的特定字符时出现问题_String_Arrays_C - Fatal编程技术网

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

String 使用strcat()函数后打印数组的特定字符时出现问题,string,arrays,c,String,Arrays,C,假设我输入a=“洛德”和b=“伏地魔”(不带引号),并将两个字符串连接起来,形成“洛德”。 然后,我想打印连接字符串的前3个字符。因此,在我的选择中,输出结果应该是“LOR”(连接字符串的前3个字符),另一方面,我的编译器显示的结果是“LVE”。 我错在哪里? 我不熟悉C语言。问题是,您将a和b声明为int数组,但将它们用作char数组。这应该会给你一个来自你的编译器的警告(总是在你的编译器上使用-Wall或者类似的东西,并注意这些警告) 解决方法很简单;将它们声明为char: a[80

假设我输入a=“洛德”和b=“伏地魔”(不带引号),并将两个字符串连接起来,形成“洛德”。 然后,我想打印连接字符串的前3个字符。因此,在我的选择中,输出结果应该是“LOR”(连接字符串的前3个字符),另一方面,我的编译器显示的结果是“LVE”。 我错在哪里?
我不熟悉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
?(只有在足够旧的编译器中才不会将其标记为错误…)