为什么我没有得到串联的字符串?

时间:2019-05-13 20:17:57

标签: c string

我在这段代码中写了两个整数,两个双精度数,并连接两个字符串,其中一个整数,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;
}

请帮助我解决这里的错误。

5 个答案:

答案 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。还有许多其他选择,例如strtolstrtod

#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;
}