我在这段代码中写了两个整数,两个双精度数,并连接两个字符串,其中一个整数,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;
}
请帮助我解决这里的错误。
答案 0 :(得分:2)
您将错误类型的参数传递给scanf。 s2是一个字符数组,因此&s2是一个指向字符数组的指针,而不是一个指向char的指针。
(您还应该进行边界检查以防止数组溢出,在最终的printf中添加换行符,等等。但是消除&将使程序编译并运行)
答案 1 :(得分:1)
因为您使用%[^\n]%*c
来扫描字符串,所以不需要输入字符串。在获得换行符作为输入后,该命令指示程序要返回。扫描d2
后,字符串从缓冲区中获得换行符,然后返回而无需进一步输入。
要摆脱这一点,您需要在输入字符串之前输入一个字符。更改以下行:
scanf("%lf",&d2);
scanf("%[^\n]%*c",&s2);
收件人:
scanf("%lf",&d2);
getchar();
scanf("%[^\n]%*c",&s2);
您的代码将正确输入字符串。
此外,您还可以通过在{{1之前放置一个 空格来完成此操作(在字符串输入之前输入一个额外的字符)。 }} 标志。
更改以下行:
%
收件人:
scanf("%[^\n]%*c",&s2);
也做同样的事情。
答案 2 :(得分:0)
可能是您使用
scanf("%[^\n]%*c",&s2);
据我所知您可以使用
scanf("%[^\n]%*c",s2);
或
scanf("%[^\n]%*c",&s2[0]);
由于变量s2本身是指向数组第一个内存地址的指针,因此使用&s2只是指向指针的指针,并且没有分配的连续内存地址来填充。希望这会有所帮助。
答案 3 :(得分:0)
替换:
scanf("%[^\n]%*c",&s2);
使用:
fgetc(stdin);
fgets(s2, 100,stdin);
答案 4 :(得分:0)
考虑使用fgets
代替scanf
作为输入。
要解析输入中的值,可以使用sscanf
。还有许多其他选择,例如strtol
和strtod
。
#include <stdio.h>
#include <string.h>
int main() {
int i = 4;
int valid = 0;
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];
char temp[100];
// Read and save an integer, double, and String to your variables.
do {
valid = 0;
printf ( "enter an integer\n");
if ( fgets ( temp, sizeof temp, stdin)) {
if ( 1 == sscanf ( temp, "%d", &i2)) {
valid = 1;
}
else {
printf ( "try again\n");
}
}
else {
fprintf ( stderr, "fgets EOF\n");
return 0;
}
} while ( ! valid);
do {
valid = 0;
printf ( "enter a double\n");
if ( fgets ( temp, sizeof temp, stdin)) {
if ( 1 == sscanf ( temp, "%lf", &d2)) {
valid = 1;
}
else {
printf ( "try again\n");
}
}
else {
fprintf ( stderr, "fgets EOF\n");
return 0;
}
} while ( ! valid);
printf ( "enter a name\n");
if ( ! fgets ( s2, sizeof s2, stdin)) {
fprintf ( stderr, "fgets EOF\n");
return 0;
}
s2[strcspn ( s2, "\n")] = 0;//remove newline
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\n",s);
return 0;
}