Intereting Posts
Что такое аргумент «char-sequence» для функций генерации NaN? Пропустить неподписанный указатель на символ atoi без приведения Использование OpenMP прекращает автоинжекцию GCC 0,7 не менее 0,7, но неправильный результат печатается Оптимизация ввода / вывода (вывод) в коде C + цикл C free () и инкрементные указатели массива Почему стандарт C ++ указывает, что целое число со знаком присваивается без знака в двоичных операциях со смешанной подписью? clang c11 threads.h не найден Какая концепция проявляется в этой макрообработке? найти уникальные пифагорейские троицы преобразовать int в char array Big Endian Функция strcmp не работает должным образом Вставьте клиентский вход в базу данных MySQL с помощью C Приложение командной строки: как подключить дочерний процесс к отладчику xcode? Могут ли битовые поля быть полями структуры / объединения, никогда «нормальными», «автономными» переменными?

Разделить строку на массив слов + 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; } } 

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

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

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

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

 #include  #include  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 .