C 为什么我没有得到连接的字符串?
我编写了这段代码,其中我想添加两个整数、两个double并连接两个字符串,其中一个整数、double和字符串已经声明,另一个整数、string和double将由用户获取。但程序似乎没有将另一个字符串作为输入 我已经编写了一个类似的程序,我可以使用scanf从用户那里获取字符串,但在这里不起作用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,
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[]=“我的大学名是”tochars[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);