Почему я не получаю объединенную строку? - PullRequest
2 голосов
/ 13 мая 2019

Я написал этот код, в котором я хочу добавить два целых числа, два двойных и объединить две строки, из которых одна из целого, двойного и строки уже объявлена, а другое целое число, строка и двойник должны быть взятыПользователь.Но похоже, что программа не принимает в качестве входных данных другую строку.

Я написал аналогичную программу, в которой я могу взять строку у пользователя, используя 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 ]

2 голосов
/ 13 мая 2019

Вы передаете неверный тип аргумента в scanf. s2 - это массив символов, поэтому & s2 - это указатель на массив символов, а не указатель на символ.

(Вы также должны иметь проверку границ, чтобы предотвратить переполнение массива, добавить новую строку в ваш конечный printf и т. Д. Но исключение & сделает вашу программу скомпилированной и запущенной)

1 голос
/ 14 мая 2019

Он не принимает ваш строковый ввод, потому что вы используете %[^\n]%*c для сканирования строки. который заставляет программу возвращаться после получения новой строки в качестве ввода . И строка получила новую строку из буфера после сканирования d2 и вернулась без дальнейшего ввода.

Чтобы избавиться от этого, вам нужно ввести символ перед тем, как вводить строку. Измените следующие строки:

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

Кому:

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

И ваш код будет правильно воспринимать строковый ввод.

Кроме того, вы также можете сделать это ( с дополнительным вводом символов перед вводом строки ), поставив дополнительный пробел перед знаком %.

Изменение следующей строки:

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

Кому:

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

Также сделайте то же самое.

0 голосов
/ 14 мая 2019

Попробуйте использовать 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;
}
0 голосов
/ 14 мая 2019

Заменить:

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

На:

fgetc(stdin);   
fgets(s2, 100,stdin);
0 голосов
/ 13 мая 2019

Возможно ваше использование

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

Насколько я знаю, вы можете использовать

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

или

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

Поскольку переменная s2 сама является указателем на первый адрес памяти массива, использование & s2 является просто указателем на указатель и не имеет выделенных последовательных адресов памяти для заполнения. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...