Итерация по массиву символов при пропуске пробелов

Я пытаюсь написать программу, которая выполняет итерацию по массиву символов (который содержит предложение), и присваивает слова в этом предложении другому массиву, пропуская пробелы (как мы знаем отдельные слова), а затем печатает эти слова,

Скажем, например, мой массив символов:

{'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(), Это будет очень легко.

Идея:

  1. использование strtok() и пространство ' ' в качестве разделителя, чтобы выяснить каждое вхождение слов.
  2. использование strcpy() скопировать скопировать возвращенный token с (слова) к word массив.

Замечания:

Я хочу, чтобы моя функция присваивала слова массиву, называла его словами по одному, пропуская пробелы, затем слова печатались по одному.

Ваш текущий код не выглядит так, как будто он делает то же самое.

  1. Вы можете избавиться от for итерация цикла по входной строке.
  2. Вы должны продолжить strtok() на тот же вход, пока он не возвращается NULL,
  3. 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);
Другие вопросы по тегам