2012-05-09 3 views
2
char *strings[30]; 
char Policystr[4096] = "the|string|to|split"; 
char delims[] = "|"; 
int i = 0; 

strings[i] = strtok(Policystr, delims) 
while(strings[i] != NULL ) 
{ 
     MessageBoxA(NULL,strings[i],"stringsComparison",MB_OK); 
     strings[++i] = strtok(NULL, delims);   
} 
for (int j = 0; j < i; j++) 
{ 
    MessageBoxA(NULL,strings[j],"strings",MB_OK); 
} 

Я новичок в C++ я получить все строки в первом цикле, если я могу напечатать то же самое во втором цикле я не знаю, ух я не получаюИспользование strtok для разбиения строки

благодарите advance

+4

'MessageBoxA (NULL, строки [J], "stringsComparison", MB_OK);' Это не может быть правильным. 'j' никогда не меняется в верхнем цикле и, по сути, даже там не существует. –

+0

Попробуйте изменить 'строки [j]' на 'строки [i]' в первом цикле ... – aland

+0

Если вы используете C++, посмотрите, можете ли вы использовать 'std :: string' и' std :: vector'. Разделение строки 'std :: string' тривиально, особенно учитывая, что' boost', вероятно, имеет что-то точно для этой цели, но даже без 'boost' должно быть легко. – dreamlax

ответ

0

Перед тем как начать использовать, попробуйте ввести i=0. В первом цикле вы должны написать MessageBoxA(NULL,strings[i],"stringsComparison",MB_OK);

+1

ya Я пробовал –

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

int main(void) 
{ 
    char *strings[30]; 
    char Policystr[4096] = "the|string|to|split"; 
    char delims[] = "|"; 

    int i = 0; 
    strings[i] = strtok(Policystr, delims); 
    while(strings[i] != NULL ) 
    { 
     printf("%d '%s'\n", i, strings[i]); 
     strings[++i] = strtok(NULL, delims);   
    } 

    for (int j = 0; j < i; j++) 
    { 
     printf("%d '%s'\n", j, strings[j]); 
    } 
} 

Выход:

0 'the' 
1 'string' 
2 'to' 
3 'split' 
0 'the' 
1 'string' 
2 'to' 
3 'split' 
+0

Этот вопрос предназначен только для C++. –

+0

Программа выше - C++. (Хотя я считаю, что это также законно C.) –

+0

Хотя педатник C++ (...) может утверждать, что вы должны «#include ' etc, 'std :: cout', написать' int main() ', использовать' std :: string'. –

1

Ваш вопрос помечен C++, но вы манипулируете строки данных, как в C программист с 1985 (без обид, это просто, что использование strtok, как правило, обескуражено в настоящее время). Поскольку вы используете C++, я бы рекомендовал избегать функций библиотеки C и вместо этого использовать функциональные возможности, доступные в стандартной библиотеке C++. Вот полностью самостоятельный рабочий пример одного из способов разделить std::string на C++. Я довольно новичок в C++, поэтому это может быть не самый эффективный способ. Преимущества такого подхода являются:

  1. Управления памяти осуществляется автоматически, без каких-либо произвольных ограничений, налагаемых вашей программы по размеру ввода или вывода.

  2. Не использовать функцию библиотеки старых (и обескураженную) C.

  3. Вам не нужно изменять исходные входные данные, чтобы разбить строку, что означает, что вы можете работать с входным сигналом, основанным на const. Это то, что strtok не в состоянии сделать, потому что strtok изменяет исходный вход.

  4. Вы можете использовать этот метод, если у вас есть char * или char [] буфер, потому что вы можете превратить его в std::string (если она не заканчивается нулевым символом вы также должны дать конструктору длину из буфер).

  5. Если вы хотите создать окно сообщения из одного из объектов std::string в векторе, вы можете использовать функцию-член .c_str(), например.

    MessageBoxA(NULL, results[i].c_str(), "strings", MB_OK); 
    

#include <string> 
#include <iostream> 
#include <vector> 

int main(void) 
{ 
    std::string delims = "|"; 
    std::string policyStr = "the|string|to|split"; 
    std::vector<std::string> results; 
    size_t lastOffset = 0; 

    while(true) 
    { 
     size_t offset = policyStr.find_first_of(delims, lastOffset); 
     results.push_back(policyStr.substr(lastOffset, offset - lastOffset)); 
     if (offset == std::string::npos) 
      break; 
     else 
      lastOffset = offset + 1; // add one to skip the delimiter 
    } 

    for (size_t i = 0; i < results.size(); i++) 
     std::cout << results[i] << std::endl; 

    return 0; 
}