2013-09-10 3 views
2

Я расщепляющая строку через strtok, но что-то другое случается, например,разбить строку через strtok в языке Си

*tok =strtok(string,"\r\n"); 

strtok, когда нашел только \r то разбить строку не весь \r\n, я хочу, строка должна быть расщепляются только тогда, когда все строка содержится в данных \r\n;

+3

2-й аргумент 'strtok' - это серия символов для разделения, например' strtok (string, ";,") 'будет разделяться на первые', 'или'; '. – Matthew

+0

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

+2

использовать 'strstr' в цикле – P0W

ответ

-1
/* strtok example */ 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[] ="- This, a sample string."; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str," ,.-"); 
    while (pch != NULL) 
    { 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " ,.-"); 
    } 
    return 0; 
} 

Выход:

Splitting string "- This, a sample string." into tokens: 
This 
a 
sample 
string 
+3

Зачем копировать пасту с http://www.cplusplus.com/reference/cstring/strtok/? – P0W

+0

спасибо человеку. может yo рассказать о любой возможности, чтобы строка разделилась на всю цепочку. ??? я действительно нуждаюсь в этом –

+0

@ P0W - Плагиат - высшая форма лести.И это иллюстративно, (вид) релевантно и характерно. _ (Вид) _, потому что он действительно не отвечает на вопрос о том, как сломать строку при каждом вхождении *** подстроки ***. – ryyker

0

Если вы на системе * NIX, вы можете использовать библиотеку POSIX Regex для достижения этого результата, как описано here.

1

Если вы хотите разбить строку на основе появления подстроки (например, «\ r \ n»), вам понадобятся функции поиска строк, такие как char * strstr (,). strstr() вернет указатель на соответствующую подстроку. Затем вы можете манипулировать результирующей строкой в ​​этой точке, чтобы удалить байт strlen ("\ r \ n") из результирующего и продолжить поиск.

[Изменено] с отличной пост here со ссылкой на отличный код this guy код

м-qayyums вызывается в цикле, чтобы показать вам, как вы можете искать (и заменить) несколько вхождений подстроки с другой подстрокой, даже пустую строку с использованием strstr (,) et. и др.

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

char *replace_str(char *str, char *orig, char *rep); 

int main() 
{ 
    char origStr[]={"this is anggg originalggg lineggg ogggf texgggt"}; 
    char newString[]={"this is anggg originalggg lineggg ogggf texgggt"}; 


    sprintf(newString, "%s", origStr); 
    while(strstr(newString, "ggg")) 
    { 
     sprintf(newString, "%s", replace_str(newString, "ggg", "")); 
    } 
    printf("Original String: %s\n", origStr); 
    printf("New  String: %s\n", newString); 

    getchar(); 

    return 0; 
} 


char *replace_str(char *str, char *orig, char *rep) 
{ 
    static char buffer[4096]; 
    char *p; 

    if(!(p = strstr(str, orig))) // Is 'orig' even in 'str'? 
    return str; 

    strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$ 
    buffer[p-str] = '\0'; 

    sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig)); 

    return buffer; 
} 

[EDIT_2] замена "GGG" с "\ г \ п" Я получил этот результат, используя код выше:

enter image description here

+0

не могли бы вы привести пример, который будет реально оценен –

+0

Да - см. Отредактированный ответ ... – ryyker

2

Чтобы разбить строку, используя множественный характер вы можете использовать strstr в петле

Просто повторите вызов strstr, чтобы найти вхождения вашей граничной строки.

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

Это некрасиво пример, но я думаю, что это то, что вам нужно

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

int main() 
{ 
    char buffer[128]; 
    char *str ="This is a long text \r\n with \r\nmany carriage returns,\ 
    I hate \r\n just this\r\n nothing else\r\n"; 

    char *token="\r\n"; 

    int l=strlen(str); 
    char *start,*p; 
    start=str; 

    p= strstr (str,token); 
    while(p) 
    { 
    strncpy(buffer,str, p-str); 
    buffer[p-str] ='\0'; 

    printf("%s\n",buffer); 

    str=p+strlen(token); 

    if((str-start) >= l) 
     break; 

    p= strstr (str,token); 
} 
if(!p) 
    printf("%s\n",str); 
return 0; 
} 

См HERE

PS: Если кто-нибудь хочет, измените код, чтобы сделать его немного лучше.

+0

ну его хороший пример. до 70% моя проблема решена. но можете ли вы проверить его с помощью этой строки, а затем посмотреть поведение программы ». Это длинный текст с большим количеством возвратов каретки, \ Я ненавижу это просто \ r \ n \ n ничего больше \ r \ n "; –

+0

Если я понял ваш вопрос, я считаю, что 100% вашей проблемы решено. Просто запустив код, который я опубликовал несколько часов назад, заменив все «ggg» на «\ r \ n», я создал изображение, которое отредактировал бы пост выше. – ryyker

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