2014-10-12 3 views
0

Я пытаюсь разбить строку на массив слов, но я зациклился на том, как это сделать в C. Мои навыки в C не очень хорошие, поэтому я могу " я думаю о способе «выполнить» мою идею. Ее то, что я до сих пор:Разделить строку на массив слов + C

int beginIndex = 0; 
int endIndex = 0; 
int maxWords = 10; 
while (1) { 
    while (!isspace(str)) { 
     endIndex++; 
    } 
    char *tmp = (string from 'str' from beginIndex to endIndex) 
    arr[wordCnt] = tmp; 
    wordCnt++; 
    beginIndex = endIndex; 
    if (wordCnt = maxWords) { 
     return; 
    } 
} 

В моем методе я получаю (обугленного * ул, символ * обр [10]), и ул является линия, которую я хочу разделить, когда я сталкиваюсь с места. arr - массив, в котором я хочу хранить слова. Есть ли способ скопировать «кусок» строки, которую я хочу с «str» в мою переменную tmp? Это лучший способ, о котором я могу думать сейчас, возможно, это ужасная идея. Если это так, я был бы рад получить некоторые документы или советы по лучшему методу.

+2

Вы можете использовать strtok для разделения строки на слова – radar

+0

В чем проблема? – CroCo

+0

Спасибо! strtok работал с первой попытки :) Но я вызываю этот метод с помощью строки из main, и я знаю, что мне нужно где-то выделить память. Должен ли я выделить память для моего char arr [10], прежде чем отправить его на этот метод из основного? – user16655

ответ

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

int split(char *str, char *arr[10]){ 
    int beginIndex = 0; 
    int endIndex; 
    int maxWords = 10; 
    int wordCnt = 0; 

    while(1){ 
     while(isspace(str[beginIndex])){ 
      ++beginIndex; 
     } 
     if(str[beginIndex] == '\0') 
      break; 
     endIndex = beginIndex; 
     while (str[endIndex] && !isspace(str[endIndex])){ 
      ++endIndex; 
     } 
     int len = endIndex - beginIndex; 
     char *tmp = calloc(len + 1, sizeof(char)); 
     memcpy(tmp, &str[beginIndex], len); 
     arr[wordCnt++] = tmp; 
     beginIndex = endIndex; 
     if (wordCnt == maxWords) 
      break; 
    } 
    return wordCnt; 
} 

int main(void) { 
    char *arr[10]; 
    int i; 
    int n = split("1st 2nd 3rd", arr); 

    for(i = 0; i < n; ++i){ 
     puts(arr[i]); 
     free(arr[i]); 
    } 

    return 0; 
} 
1

Вы должны проверить функцию C-библиотеки strtok. Вы просто загружаете строку, которую хотите разбить, и строку разделителей.

Вот пример того, как это работает (взято из связанного сайта):

#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; 
} 

В вашем случае вместо того, чтобы печатать каждую строку, которую вы бы присвоить указатель, возвращаемый strtok к следующему элементу в массиве arr.

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