Итерация по массиву символов при пропуске пробелов
Я пытаюсь написать программу, которая выполняет итерацию по массиву символов (который содержит предложение), и присваивает слова в этом предложении другому массиву, пропуская пробелы (как мы знаем отдельные слова), а затем печатает эти слова,
Скажем, например, мой массив символов:
{'t','h','e',' ','f','o','x',' ','r','u','n','s','\0',}
Я хочу, чтобы моя функция присваивала слова массиву, вызываю его words
, по одному, пропуская пробелы, слова затем печатались одно за другим.
Я попробовал это:
for (i = 0, x = 0; a[i] != '\0'; i++, x++){
if (a[i] != ' '){
words[x] = a[i];
}
else{
words[x] = '\0';
printf("%s\n", words);
x=0;
i++;
continue;
}
}
printf("%s\n", words);
Но когда я запустил его, он только распечатал s
4 ответа
Обратите внимание, что переменные (кроме массива a
(который явно задан как строка), определенные вне main, по умолчанию обнуляются компилятором и не требуют явной инициализации, но вы должны быть очень осторожны с инициализацией в целом и особенно внутри функций.
А также a
Хотя он определен как указатель на строковый литерал, он также может быть доступен как массив символов.
Выход:
words[0] = the
words[1] = fox
words[2] = runs
Это работает:
#include <stdio.h>
#define MAX_WORDS 1000
#define MAX_WORD_LEN 32
char *a = "the fox runs";
char words[MAX_WORDS][MAX_WORD_LEN];
int i, j, k;
int
main(void)
{
for (i = 0; k < MAX_WORDS && a[i] != '\0'; i++) {
if (a[i] != ' ' && j <= 32) {
words[k][j++] = a[i];
} else {
words[k++][j] = '\0';
printf("words[%d] = %s\n", k - 1, words[k - 1]);
j = 0;
}
}
printf("words[%d] = %s\n", k, words[k]);
}
Мое предложение, пойти с strtok()
, Это будет очень легко.
Идея:
- использование
strtok()
и пространство' '
в качестве разделителя, чтобы выяснить каждое вхождение слов. - использование
strcpy()
скопировать скопировать возвращенныйtoken
с (слова) кword
массив.
Замечания:
Я хочу, чтобы моя функция присваивала слова массиву, называла его словами по одному, пропуская пробелы, затем слова печатались по одному.
Ваш текущий код не выглядит так, как будто он делает то же самое.
- Вы можете избавиться от
for
итерация цикла по входной строке. - Вы должны продолжить
strtok()
на тот же вход, пока он не возвращаетсяNULL
, words[x]
должен бытьchar *
(с правильно распределенной памятью) илиchar []
(массив), чтобы хранить каждое слово, найденное во входной строке, а затем печатать одно за другим.
Это полная программа?
words[x] = a[i];
Вы, вероятно, хотели бы поставить words[x]
в приращении цикла x
от 1
каждый раз, когда вы не можете найти пустое место.
Хорошо, я заметил, что вы отредактировали его. Кроме того, это массив, так что я предполагаю, что вам нужно перебрать массив и напечатать каждый символ.
Для печати,
for (j = 0; j < sizeof(words)/sizeof(words[0]); j++ )
{
printf("%c", words[j] );
}
При продолжении цикла вам не нужно иметь i++
и вам нужно установить x=-1
,
for (i = 0, j = 0; a[i] != '\0'; i++, x++){
if (a[i] != ' '){
words[x] = a[i]; // U need to use j
}
else{
words[x] = '\0';
printf("%s\n", words);
x=-1; // as you are using continue
// i++; You don't need this
continue;
}
}
printf("%s\n", words);