C Программирование. Чтение ввода и разбора его на слова - PullRequest
0 голосов
/ 11 сентября 2009

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

образец:

вход: это только тест

массив: [t, h, i, s,, i, s,, o, n, l, y,, a,, t, e, s, t, null]

Я хотел бы получить массив String [это, только, 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");

}

Ответы [ 3 ]

2 голосов
/ 11 сентября 2009

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

char* token = strtok(msg, " ");
while (token != NULL) {
  printf("%s", token);
  token = strtok(NULL, " ");
}
0 голосов
/ 11 сентября 2009

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

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

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

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

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"
 * ...
 */
0 голосов
/ 11 сентября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...