C 为什么我没有得到连接的字符串?

C 为什么我没有得到连接的字符串?,c,string,C,String,我编写了这段代码,其中我想添加两个整数、两个double并连接两个字符串,其中一个整数、double和字符串已经声明,另一个整数、string和double将由用户获取。但程序似乎没有将另一个字符串作为输入 我已经编写了一个类似的程序,我可以使用scanf从用户那里获取字符串,但在这里不起作用 int main() { int i = 4; double d = 4.0; char s[] = "My college name is "; // Declare second integer,

我编写了这段代码,其中我想添加两个整数、两个double并连接两个字符串,其中一个整数、double和字符串已经声明,另一个整数、string和double将由用户获取。但程序似乎没有将另一个字符串作为输入

我已经编写了一个类似的程序,我可以使用scanf从用户那里获取字符串,但在这里不起作用

int main() {
int i = 4;
double d = 4.0;
char s[] = "My college name is  ";

// Declare second integer, double, and String variables.
int i2,sum1;
double d2,sum2;
char s2[100];

// Read and save an integer, double, and String to your variables.
scanf("%d",&i2);
scanf("%lf",&d2);
scanf("%[^\n]%*c",&s2);

sum1= i+i2;
sum2= d+d2;
strcat(s,s2);

// Print the sum of both integer variables on a new line.
printf("%d\n",sum1);
printf("%.1lf\n",sum2);
printf("%s",s);


return 0;}
在我做了必要的更改后,例如从
s2
中删除
&
并将
s[]
更改为
s[200]
,我仍然无法获得连接的字符串。我正在写我编辑过的代码。请帮帮我

int main() {
int i = 4;
double d = 4.0;
char s[200] = "My college name is  ";


// Declare second integer, double, and String variables.
int i2,sum1;
double d2,sum2;
char s2[100];

// Read and save an integer, double, and String to your variables.
scanf("%d",&i2);
scanf("%lf",&d2);
scanf("% [^\n]%*c",s2);

sum1= i+i2;
sum2= d+d2;
strcat(s,s2);

// Print the sum of both integer variables on a new line.
printf("%d\n",sum1);
printf("%.1lf\n",sum2);
printf("%s",s);


return 0;
}

请帮我解决这个错误。

您将错误类型的参数传递给了scanf。s2是字符数组,因此&s2是指向字符数组的指针,而不是指向字符的指针

(您还应该进行边界检查,以防止数组溢出,在最终printf中添加换行符,等等。但删除&将使您的程序编译并运行)

可能需要使用

scanf("%[^\n]%*c",&s2);
据我所知,你可以使用

scanf("%[^\n]%*c",s2);

由于变量s2本身是指向数组第一个内存地址的指针,因此使用&s2只是指向指针的指针,没有分配的连续内存地址可填充。希望这有帮助。

替换:

scanf("%[^\n]%*c",&s2);
与:


它不接受字符串输入,因为您使用
%[^\n]]*c
扫描字符串。它指示程序在获取换行符作为输入后返回。在扫描
d2
之后,字符串从缓冲区中得到一个换行符,并返回,而不需要进一步输入

要解决这个问题,您需要在输入字符串之前输入一个char。更改以下行:

scanf("%lf",&d2);
scanf("%[^\n]%*c",&s2);
致:

您的代码将正确地接受字符串输入

此外,您还可以通过在
%
符号前加上一个空格来完成此操作(在字符串输入之前输入一个额外的字符)

更改以下行:

scanf("%[^\n]%*c",&s2);
致:


也要做同样的事情。

strcat
正在尝试向
s
写入超出其容量的数据。
strcat(s,s2)
错误:
s
的大小正好与它初始化到的字符串的大小相同。您需要采用并一致地应用它。缩进传达了结构和意图,使我们更容易理解您的代码,而无需花费大量时间对其进行破译。空格位于
%
之前。有关“跳过的数据”问题,请参见。请注意,只有3个
scanf()
转换不会跳过空格-
%c
%[…]
(扫描集)和
%n
。还请注意,每次都应该检查
scanf()
中的返回值,以确保获得预期的数据。我在scanf中删除了“&”,但我的输出没有显示连接的结果,但我现在可以键入输入。我还更改了char s[]=“我的大学名是”to
chars[200]=“我的大学名是”,但仍然不是working@GaganBatra您还需要xing提到的空格字符<代码>“%[^\n]%*c”
您现在有了“%[^\n]”而不是“%[^\n]”。空格必须在%之前,而不是之后(因此您指示scanf吃一个空格,然后将换行符之前的所有内容存储到您的变量中。您还可以#包含和获取所使用函数的声明,并在所有警告打开的情况下编译(从gcc,-Wall-Werror)。在这种情况下,它们不会有帮助,但编译器确实为您找到了许多错误。或者,更好的方法是使用
“%[^\n]%*c”
。这样更好。我会将其添加到答案中。感谢您在@JonathanLeffler中改进答案
scanf("%lf",&d2);
scanf("%[^\n]%*c",&s2);
scanf("%lf",&d2);
getchar();
scanf("%[^\n]%*c",&s2);
scanf("%[^\n]%*c",&s2);
scanf(" %[^\n]%*c",&s2);