Использование strtok для разделения слов и удаления, и () - PullRequest
0 голосов
/ 24 декабря 2018

Предполагается, что моя программа берет фразу, разделяет все слова и печатает их в новой строке без каких-либо ',', '(' или ')'.Это мой кодПока что это работает, но я хотел бы улучшить его, если это возможно.Кроме того, я не знаю, является ли это проблемой или нет, но, похоже, она удаляет «(» и «)» из одного слова, но не из обоих.Таким образом, «(тест» или «тест)» будет выводить только «тест», как и предполагалось, но «(тест)» выводит «тест)».Не уверен, что это нормально или нет .. как я могу это улучшить?

#include <stdio.h>
#include <string.h>

void function(char *string)
{
    const char delim[2] = " ";
    char *token;
    int n, i, j;

    token = strtok(string, delim);
    while (token != NULL) {
        n = strlen(token);
        if (strstr(token, ",")) {
            for (i = j = 0; i < n; i++) {
                if (token[i] != ',')
                    token[j++] = token[i];
            }
            token[j] = '\0';
        }else if (strstr(token, "(")) {
            for (i = j = 0; i < n; i++) {
                if (token[i] != '(')
                    token[j++] = token[i];
            }
            token[j] = '\0';
        } else if (strstr(token, ")")) {
            for (i = j = 0; i < n; i++) {
                if (token[i] != ')')
                    token[j++] = token[i];
            }
            token[j] = '\0';
        }

        printf("%s\n", token);
        token = strtok(NULL, delim);
    }
}

int main(void)
{
    char test[80] = "The next appointment is on the 7.1.2019, 10:00 a.m., in HS 1 (Building C)";
    char input[80];

    gets(input);
    function(test);
    function(input);
    return 0;
}

1 Ответ

0 голосов
/ 24 декабря 2018

Вы можете сделать так же, как следующий код:

#include <stdio.h>
#include <string.h>

void function(char *string)
{
    const char delim[10] = " ,()";
    char *token = strtok(string, delim);
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, delim);
    }
}

int main(void)
{
    char test[80] = "The next appointment is on the 7.1.2019, 10:00 a.m., in HS 1 (Building C)";

    function(test);

    return 0;
}

Объясните:

Каждый вызов strtok () возвращает указатель на строку с нулевым символом в конце, содержащую следующуюмаркер.Эта строка не включает байт-разделитель.Если токены больше не найдены, strtok () возвращает NULL.

см. http://man7.org/linux/man-pages/man3/strtok.3.html

...