чтение 2 строк в каждой строке из ввода и печать их в l oop in C - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь написать программу, которая читает ввод (где в каждой строке 2 слова), и я хочу напечатать эти слова. но это дает мне странный вывод.

#include <stdio.h>
int main() 
{
    char word1[21], word2[21], text[5005];
    int line = 0, i;
    while (fgets(text, sizeof(text), stdin))
    { 
        sscanf(text, "%s %s", &word1[line], &word2[line]);
        line++;
    }
    for(i = 0; i < line; i++)
       {
           printf("%s %s", word1, word2);
           printf("\n");
        }
    return 0;
}

когда я, например, ввожу:

dog cat
black white

вывод:

dblack cwhite
dblack cwhite

как мне сделать вывод, как это?

dog cat
black white

Ответы [ 2 ]

1 голос
/ 04 мая 2020

1.

word1 и word2 - это просто массивы char:

char word1[21], word2[21];

Таким образом:

while (fgets(text, sizeof(text), stdin))
{ 
    sscanf(text, "%s %s", &word1[line], &word2[line]);
    line++;
} 

запишет входные строки различных строк последовательно к следующему символьному элементу в wordN, а не к другой word памяти.

Это приводит к выводу

dblack cwhite

.

black записывается, начиная со второго элемента word1, где dog ранее хранилось, начиная с первого элемента. white записывается начиная со второго элемента word2, где cat был сохранен ранее, начиная с первого элемента. Оба используют одну и ту же память, за исключением первого элемента.

2.

while (fgets(text, sizeof(text), stdin)) - Условие всегда будет истинным, если не возникла ошибка I/O.


Если вы просто хотите бесконечно печатать 2 слова, заданные в качестве ввода для каждой строки (как вы сказали) и использовать fgets() для перехвата, используйте это вместо этого. Это намного компактнее:

#include <stdio.h>

int main(void) 
{
    char word1[50], word2[50], line_text[50];

    while (fgets(line_text, sizeof(line_text), stdin))
    { 
        sscanf(line_text, "%s %s", word1, word2);
        printf("%s %s\n", word1, word2);
    }

    return 0;
}

Вход:

hello world
dog cat
black white
apple banana

Выход:

hello world 
dog cat
black white
apple banana
0 голосов
/ 04 мая 2020

Ваш word1[line] имеет буфер длиной всего 1 символ. Вы должны выделить массивы массивов символов.

Также не забудьте напечатать каждую строку.

#include <stdio.h>
int main() 
{
    char word1[21][5005], word2[21][5005], text[5005];
    int line = 0, i;
    while (fgets(text, sizeof(text), stdin))
    { 
        sscanf(text, "%s %s", word1[line], word2[line]);
        line++;
    }
    for(i = 0; i < line; i++)
       {
           printf("%s %s", word1[i], word2[i]);
           printf("\n");
        }
    return 0;
}
...