2015-11-16 1 views
0

Есть ли способ, по которому вы разделили строку на токены, чтобы преобразовать эти токены назад в исходную строку (с пунктуацией и оригинальной чувствительностью к регистру)?Преобразование измененных токенов strtok обратно в «синтаксис» исходной строки

Я уверен, что будет вызываться strcat, но что было бы хорошим способом для поддержания пунктуации оригинальной строки & чувствительность к регистру?

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

Редактировать: название было изменено & уточнено, я надеюсь.

char* msg = malloc(10000); 
char* msg2 = malloc(10000); 
char* buffer; 
char buffer2[10000]; 

printf("input: \n"); 
fgets(msg, 9999, stdin); 

msg2 = strdup(msg); 
buffer = strtok(msg2, " ;,.!?\n"); 
Node* ptr; // assume this is initialized to a linked list containing 2 strings per node (str, str2) 
while (buffer) { 

     for (int i = 0; i < strlen(buffer); i++) { //strcmp is case-sensitive 
      if (isalpha(buffer[i])) { 
       buffer[i] = tolower(buffer[i]); 
      } 
     } 
     while (ptr) { 
      if ((ptr != NULL) && (strcmp(ptr->str, ptr->str2) != 0)) { 
       buffer = ptr->str2; // modifies the token 
       break; 
      } 
    } 
    ptr = ptr->next; 
    } 
    strcat(buffer2, " "); // this will concatenate the modified tokens back together with spaces 
    strcat(buffer2, buffer); // but I lose the original string's structure (i.e.: punctuation, case-sensitivity) 
    buffer = strtok(NULL, " ;,.!?\n"); 

    printf("%s", buffer2); // so how should I get the original string's structure back with the modified tokens? 
+1

Ум ... Сохранить копию, прежде чем вы ее разделите? –

+0

@KenWhite Мне нужно изменить каждый токен индивидуально, хотя так, чтобы я не делал много пользы, я думаю. Плюс у меня есть сохраненная копия: 'char * msg' нетронутой. – Sleepless

+2

Проблема заключается в том, что если вы не нарушаете слова на одном разделителе или не сохраняете разделитель между каждым словом, невозможно воссоздать строку, потому что вы не знаете, какой разделитель был там изначально. Если вы просто хотите записать токены с промежутком между ними, см. 'Sprintf'. –

ответ

1

Если вы хотите использовать strtok() и хотите получить доступ к исходной строке позже, пожалуйста, сохраните копию исходной строки, так как strtok() уничтожит исходную строку.

// we have char *st ; 

char *tem = malloc(strlen(st)+1); 
strcpy(tem, st); 

Теперь вы можете получить доступ к исходной строке позже.

+1

Между ответом и комментарием есть очень тонкая грань. Вы являетесь конечным судьей, но вы хотите всегда спрашивать: «Я предоставляю прямой ответ на заданный вопрос, или я предоставляю обход?» Никакого вреда не было, но я бы сделал противоположный вывод. –

+0

Извините. Значит, вы имеете в виду, что я должен дать прямой ответ на эту проблему? – Tipton

+0

Нет, я имел в виду, что было очень близко, был ли то, что вы опубликовали, было фактическим ответом на то, было ли это лучше, чем комментарий. Если то, что вы публикуете, может соответствовать этому комментарию и не является прямым решением вопроса, то, вероятно, это лучше, чем комментарий. Как я уже сказал, никакого вреда не было, просто помните о различии. –

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