Как правильно отформатировать целое число в c? - PullRequest
1 голос
/ 22 февраля 2010

Скажем, у меня есть текстовый файл с несколькими именами и соответствующими днями рождения, например:

Джон Доу 2 34
Лорен Доу 3 4
Альберт р. Грифтон 03 12

Программа-конвертер создаст имена пользователей для учеников, такие как:

jd0234
ld0304
arg0312

Проблема, с которой я столкнулся, - это добавление нулей для условий if / else для нечетного количества дней рождения.

Пока моя программа стоит, она печатает:

jd234
ld34
arg0312

Я знаю, что есть 3 случая.

  1. Если есть 3 цифры, добавьте ноль.
  2. Если есть 2 цифры, добавьте два нуля.
  3. Если есть 4 цифры, все хорошо.

Я знаю, как соответствующим образом отформатировать строку с помощью printf ("% 02d, num). Хотя я не думаю, что это необходимо для моей цели, поскольку эта программа работает с другой, использующей каналы.

//      converter.c
//      

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

int main(void)
{
    char line[512];
while(!feof(stdin))
{
    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))
           {
                              //birthdays are evaluated here
               while (dst < end && isdigit(c))
               {
                    *dst++ = c;
                    c = *src++;
               }
           }
        }

        *dst = '\0';
        puts(name);
        fflush(stdout);
    }
}
return 0;
}

Ответы [ 6 ]

3 голосов
/ 22 февраля 2010

Как только вы токенизировали строку, последние два токена должны быть проанализированы с atoi, тогда у вас будет два целых числа. Они могут быть напечатаны с sprintf(%02d, myInt).

1 голос
/ 22 февраля 2010

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

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

Вы можете использовать sprintf для этого .... я приведу пример ... Предположим, у вас есть целочисленное значение i ... оно может быть в диапазоне от 1 до 30 .... Теперь для значений от 1 до 9 вы хотите напечатать его как 01,02, .... 09 .... rite? ??

Следуйте этому:

int main () { int i = 1; char str [10]; Sprintf (ул, "% 02d", я); }

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

Мне нужно задать вопрос об используемых переменных dst, line и name ... они инициализированы? Глядя на это, я нахожусь под впечатлением, поскольку они не инициализированы, возможно, в буферах, на которые указывают указатели, может быть мусор, и у меня есть ощущение, что указатели собираются сработать и перешагнуть границы ... проверяйте и наблюдайте очень внимательно перед запуском ...

Редактировать: После комментария от ОП ... вот подсказки ...

line[0] = '\0'; 
// before the 'if((fgets(line, sizeof(line), stdin) != 0))'
name[0] = '\0';
// before the 'while (*src != '\0')'

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

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

попробуйте это:

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

int main(void)
{
    char line[512];
    while(!feof(stdin))
    {
        if((fgets(line, sizeof(line), stdin) != 0))
        {
            char  buffer[512];
            char *p1 = line;
            char *p2 = NULL;
            int   valid = 0;

            while(*p1)
            {
                /* skip space */
                for(; *p1 && isspace(*p1); *p1++);

                /* extract to next space */
                for(p2 = buffer; *p1 && !isspace(*p1); *p2++ = *p1++);

                /* terminate p2 */
                *p2 = 0;

                /* check for alpha or digit */
                if(isalpha(buffer[0])) {
                    printf("%c", buffer[0]);
                    valid = 1;
                } else if(isdigit(buffer[0])) {
                    printf("%02d", atoi(buffer));
                    valid = 1;
                }
            }

            if(valid) {
                printf("\n");
            }
        }
    }
    return 0;
}
0 голосов
/ 22 февраля 2010

sprintf() и snprintf().

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