Программирование на языке Си.Чтение входных данных и разбор их на слова

StackOverflow https://stackoverflow.com/questions/1407872

  •  05-07-2019
  •  | 
  •  

Вопрос

Я пишу небольшую программу на C, которая будет считывать входные данные с консоли.Затем поместите его в массив char.После этого мне нужно разбить массив на слова.Я не уверен, как это сделать.До сих пор я помещал входные данные в массив char.Мне нужно знать, есть ли способ маркировать на основе пустого символа.Или любые другие предложения о том, как справиться с этой проблемой.Спасибо.

образец:

входные данные:это всего лишь проверка

массив:[t,h,i,s, ,i,s, ,o,n, l, y, ,a, ,t,e,s,t,ноль]

Я хотел бы получить массив строк [this,is,only,a,test,null]

main() {

    char msg[50], ch;
    int i = 0;

    printf("***Reading words in your input*****\n\n");
    printf("Type something terminated by ENTER button\n");

    while ((ch = getchar()) != '\n')
        msg[i++] = ch;

    msg[i] = '\0';

    i = 0;

    while (msg[i] != '\0')
        putchar(msg[i++]);
    printf("\n");

}
Это было полезно?

Решение

Да, используйте strtok функция:

char* token = strtok(msg, " ");
while (token != NULL) {
  printf("%s", token);
  token = strtok(NULL, " ");
}

Другие советы

Если вы хотите прочитать все слова до конца файла (не останавливаясь на новой строке), то это проще:

#include <stdio.h>
int main(){
    char b[999];
    while (scanf("%s",b)==1)
        puts(b);
    return 0;
}

Возвращаемое значение scanf - это количество успешно проанализированных полей, или EOF.Пробелы служат для разделения полей "%s", так что вы получаете нужные токены.Конечно, если вы сначала прочитаете строку, вы все равно можете использовать sscanf.

Если вы хотите накопить массив строк вместо того, чтобы просто обрабатывать их одну за другой ("puts(b)" выше), тогда вам нужно будет испачкать руки realloc, malloc, strcpy и strlen.Буферы фиксированного размера в любом случае отвратительны.

В C нет строк в том смысле, в котором вы используете это слово.C содержит массивы символов.

Если вам нужен массив строк ...у вас может быть что-то похожее на массив массивов символов.

Но каждый массив имеет заранее определенный размер, и вы не можете добавить больше "строк" или сделать их длиннее, чем доступное пространство.Другой вариант (вместо массивов массивов char) - использовать указатели и память из malloc() и friends (обсуждение poonters, malloc() и friends я оставлю на другой раз).

Чтобы определить массив array of char и разделить предложение пробелами, вы можете сделать это

char array_of_string[10][6]; /* 10 strings of a maximum of 5 characters each, plus the NUL */
char msg[50] = "this is a test";
/* now split the msg and put the words in array_of_string */
int string_num = 0;
int word_size = 0;
int msg_index = 0;

while (msg[msg_index] != '\0') {
    if (msg[msg_index] != ' ') {
        /* add the character to the proper place in array_of_string */
        array_of_string[string_num][word_size] = msg[msg_index];
        /* and update word_size for next time through the loop */
        word_size++; /* needs check for reserved word size (5) */
    } else {
        /* a space! */
        /* first, terminate the current word */
        array_of_string[string_num][word_size] = '\0';
        /* prepare to start the next word */
        string_num++; /* needs check for reserved number of "strings" (10) */
        word_size = 0;
    }
}
/* array_of_string[0] is now "this"
 * array_of_string[1] is now "is"
 * ...
 */
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top