2015-02-19 3 views
0

У меня есть массив символов:c как разрезать первые x слова строки?

char tmp[2048]; 

Я хочу, чтобы вырезать из первых х слов ТМП. Я определяю слово как последовательность символов, которая не включает пробелы. Я пытался что-то вроде этого (следует вырезать из первых 3 слов):

sscanf(tmp, "%*s %*s %*s %s", tmp); 

Моя проблема в том, что «% s» останавливается на первом пробельных он находит. Я хочу, чтобы новая строка заканчивалась в конце старой строки, а не в первом пробеле.

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

+5

Почему бы вам просто не использовать строку 'std :: string', которая позволяет вам делать все это с помощью 2 или 3 строк кода, никаких ошибок, утечек памяти и полной безопасности исключений? Почему вы хотите иметь дело с необработанными динамическими массивами? –

+0

Что такое возвращаемое значение sscanf в вашем коде? sscanf возвращает количество элементов в списке аргументов, которые были заполнены. –

+0

Есть ли причина, по которой вы используете 'sscanf', а не' strcpy' или 'memcpy'? Кажется, вы используете неправильный инструмент для работы. – Julian

ответ

1

Вот грубая реализация:

const char* TrimWords(const char* input, int nWords) 
{ 
    while (nWords) 
    { 
     if (!isspace(*input) && isspace(*(input + 1))) 
     { 
      nWords--; 
     } 
     input++; 
    } 
    return input; 
} 

TrimWords("One Two Three Four Five", 3); 
// returns " Four Five" after the first 3 words are trimmed. 

Подробные ввод проверка и проверки ошибок осталось ОП.
Это всего лишь хорошая отправная точка.

+0

Хм, мне это нравится намного лучше, чем мое возможное решение. – Julian

+0

nice, у меня мало знаний о массивах char в c, спасибо за эту отправную точку, я смогу настроить это для своих нужд. – timakro

+0

предложит изменить ваше состояние, чтобы перейти к следующему слову: '(isspace (* input) &&! isspace (* (input + 1))) ' – timakro

0

использование strncpy(tmp, n, tmp+m);, где т и п Интс

char tmp[20] = "abcdef"; 

strncpy(tmp, tmp + 3, 2); 

для exmaple: Код выше будет приводить к decdef

+0

сделал мой вопрос более ясным, я хочу вырезать первые x слов строки. – timakro

0

Вы можете использовать strtok для разбития строки пробелами. Нечто похожее на это может делать то, что вы пытаетесь достичь:

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

int main(int argc, char *argv[]) 
{ 
    // Number of words to trim 
    const int numWords = 2; 

    char tmp[1024]; 
    char buffer[1024]; 
    sprintf(tmp, "this is a\tsentence."); 

    strcpy(buffer, tmp); 

    char* token = strtok(buffer, " \t"); 
    for (int i = 0; i < numWords && token; i++) { 
     token = strtok(NULL, " \t"); 
    } 

    if (token) { 
     size_t len = 1024 - (token - buffer); 
     memmove(tmp, tmp + (token - buffer), len); 
    } 
    else { 
     memset(tmp, '\0', 1024); 
    } 

    // Prints "a sentence." 
    printf("%s", tmp); 
    return 0; 
} 

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

+0

Никогда, никогда не используйте 'strtok'. [*** Ссылка ***] (http://stackoverflow.com/questions/28588170/is-strtok-broken-or-just-tricky/28588171?noredirect=1#comment45499462_28588171) – abelenky

+0

@abelenky Интересно; Я знаю о многих опасных функциях C, но я не знал об этой особенности, поскольку я отклонился довольно далеко от C и намного больше к C++. – Julian

Смежные вопросы