Как перейти к чтению строки, а затем отформатировать ее в C? - PullRequest
0 голосов
/ 10 февраля 2010

Как бы я прочитал строку из stdin и отформатировал ее как stdout?

Например: Если я получу чье-то имя: Джон Доу 03 17

Я хочу создать для него имя пользователя как таковое: jd0317

Хотя это может измениться для кого-то со вторым именем: Джейн Б. Доу 05 18

Тогда это будет: jbd0518

Я предполагаю, что вы прочитаете строку, а затем, когда достигнете пробела, вы сохраните ту часть имени в массиве и отрежете остальную часть, которая вам не понадобится. Я продолжал бы читать, пока CTRL ^ D не будет прочитан из стандартного ввода, который будет представлять EOF.

Буду ли я использовать scanf в цикле или getchar?

Ответы [ 5 ]

2 голосов
/ 10 февраля 2010

Я бы использовал fgets (), чтобы получить строку, а затем обработал бы ее, чтобы получить имя:

#include <string.h>
#include <stdio.h>
#include <ctype.h>

int main(void)
{
    char line[512];
    if (fgets(line, sizeof(line), stdin) != 0)
    {
        char  name[16];
        char *dst = name;
        char *end = name + sizeof(name) - 1;
        char *src = line;
        while (*src != '\0')
        {
           char  c;
           while ((c = *src++) != '\0' && isspace(c))
               ;
           if (isalpha(c))
           {
               if (dst < end)
                   *dst++ = tolower(c);
               while ((c = *src++) != '\0' && !isspace(c))
                   ;
           }
           else if (isdigit(c))
           {
               while (dst < end && isdigit(c))
               {
                    *dst++ = c;
                    c = *src++;
               }
           }
        }
        *src = '\0';
        puts(name);
    }
    return 0;
}

Учитывая вход 'John Doe 03 17' выводит 'jd0317'; с учетом ввода «Джейн Б. Доу 05 18» генерирует «jbd0518».

0 голосов
/ 10 февраля 2010

Чтобы прочитать всю строку, включая пробелы, вы можете использовать fgets в цикле, пока не встретится EOF. Затем вы можете использовать либо sscanf, либо strtok, чтобы добраться до отдельных разделенных пробелами элементов каждой строки.

sscanf обычно лучший выбор, если вы уже знаете, сколько токенов содержится в каждой строке и их типы. strtok позволяет получать все токены из линии, даже если вы не знаете, сколько у них токенов.

0 голосов
/ 10 февраля 2010

Вы можете использовать fgets в цикле, пока не будет возвращено значение NULL (что происходит при достижении EOF).
Используя его, вы можете прочитать полную строку из ввода в массив символов.

Затем вы можете проанализировать строку в поисках пробелов, и каждый раз, когда вы видите пробел, посмотрите, был ли предыдущий блок не числовым, если да, скопируйте свой первый символ в результат. Если это числовое значение, скопируйте его цифры в результат, сделав их символами.

0 голосов
/ 10 февраля 2010

Вы можете использовать getchar в цикле и использовать EOF или символ новой строки в качестве условия завершения цикла. В тот момент, когда вы читаете символ, вводите его в массив и игнорируете другие символы до пробела, затем сохраняйте символ рядом с пробелом в вашем массиве и повторяйте содержимое игнорирующих символов, пока не достигнете следующего пробела.

Но вам нужно заботиться о числах, поскольку вы, похоже, хотите хранить все числа как есть. Для этого вы можете сравнить введенный символ со значениями ASCII чисел от 1 до 9, чтобы увидеть, является ли это буквой или цифрой, и сохранить все числа. Возможно, вы захотите сделать это только в том случае, если символ, введенный сразу после пробела, является числом, поскольку ваш вопрос предполагает это требование.

Кроме того, вам может потребоваться выполнить некоторые проверки ошибок, как того требует ваша функциональность. Пожалуйста, не забудьте проверить границы массива в массиве, где вы храните это.

Это всего лишь мое основное предложение. Надеюсь, это поможет.

0 голосов
/ 10 февраля 2010

Для чтения используемых данных используйте либо fgets () с циклом stdin, либо getchar () - либо посмотрите, есть ли в вашей библиотеке функция getline ().

Затем вы можете разделить полученную строку с помощью strtok (), или, если это кажется слишком сложным (это на первый взгляд), вы можете разделить ввод самостоятельно, когда читаете его с помощью getchar () - просто обнаружите пробелы и скопируйте ценности сами.

...