разделение строк и форматирование в C - PullRequest
2 голосов
/ 25 ноября 2008

У меня есть строка типа "1234567890". Теперь мне нужно сохранить / распечатать это в следующем формате, 123-456-7890

Каков наилучший способ реализовать это в C?

Спасибо за комментарии / ответы.

Ответы [ 6 ]

2 голосов
/ 25 ноября 2008
printf("%c%c%c-%c%c%c-%c%c%c%c"
  , s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);
2 голосов
/ 25 ноября 2008

C, который является довольно "старым" языком (он относится к семидесятым), имеет в своей стандартной библиотеке функции манипуляции со строками, такие как strcat, strcpy и т. Д.

Просто посмотрите ссылку на файл заголовка string.h , этого должно быть достаточно.

edit : если вы можете, я предлагаю вам использовать более продвинутый язык, такой как C ++, который имеет гораздо более мощные конструкции, такие как класс std :: string. В настоящее время должен быть компилятор C ++ почти для каждой ОС и платформы, включая встроенные системы.

2 голосов
/ 25 ноября 2008

По этому поводу будет две школы мысли о том, что является «лучшим».

Одна школа говорит, что, если он функционален и безопасен, любой метод, использующий наименьшее количество ресурсов (память и циклы процессора), является "лучшим".

Одна школа говорит, что, если он функционален и безопасен, любой метод, который легче всего читать и поддерживать (хотя он может быть неэффективным), является "лучшим".

Редактировать: Отредактировал мой ответ, так как я не люблю давать ответы на домашние задания в коде

Как и предлагали другие ответы и комментарии, вам лучше всего почитать документацию для string.h и printf / sprintf.

0 голосов
/ 25 ноября 2008

Вы можете копировать символы по одному, одновременно сохраняя счетчик количества скопированных символов. Перед копированием символа, проверьте, является ли счетчик 3 или 6; если это так, напишите тире ('-') на выходе. Это позволит убедиться, что цифры сгруппированы по мере необходимости:

const char* input = "1234567890";
char output[20];  // allocate a buffer big enough to fit the result

const char* src = input;  // the current source byte
char* dst = output;       // the current destination
int charsCopied = 0;      // counter

// loop until we reach the terminating NUL of the source string
while (*src) {

    // insert the dash in the output when needed
    if (charsCopied == 3 || charsCopied == 6) {
        *dst++ = '-';
    }

    // copy the current character and move to the next
    *dst++ = *src++;
    charsCopied += 1;
}

// terminate the output string and print it
*dst = '\0';
puts(output);
0 голосов
/ 25 ноября 2008

Не вдаваясь в подробности, на случай, если это домашнее задание ... Вероятно, вы захотите использовать комбинацию strncpy и strcat (вместе с string.h).

Из-за того, как строки обрабатываются в C, вам нужно будет указать начальную точку в строке, чтобы начать копирование. например.,

strncpy (dest, src + startPos, copyLength)
0 голосов
/ 25 ноября 2008

Вы можете использовать realloc для перераспределения строкового буфера (он не в стеке, не так ли?), А затем memmove для сдвига необходимых символов.

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