Как добавить символ в массив и токенизировать его C - PullRequest
2 голосов
/ 10 октября 2019

В своей основной функции я использую letter(ch). Я пытаюсь заставить некоторые буквенные символы стать строкой или токеном. Перед использованием функции append она просто распечатывает все символы.

//output  
000: u  
001: s  
002: e  
003: .  
004: s  
005: y  
006: s  
007: t  
008: e  
009: m  
010: .  
011: i  
012: o  
013: ;  

Я нашел добавочную функцию, которая переводит буквенные символы в массив, но выводит их как пирамида. Как получить последний результат после добавления и использовать '\0', чтобы разделить его? Разве он не должен был разделить его на начальную '\0' в функции append? Я подхожу к этому в правильном направлении? Есть ли что-то, что мне не хватает для разделения после нуля?

//output   
000: u  
001: us  
002: use  
003: .  
004: uses  
005: usesy  
006: usesys  
007: usesyst  
008: usesyste  
009: usesystem  
010: .  
011: usesystemi  
012: usesystemio  
013: ;  

//main.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include "ch_type.h"


FILE *file;
char line[400];
int line_num;
char  ch;

void append(char* line, char ch)
{
    int length = strlen(line);
    line[length] = ch;
    line[length + 1] = '\0';
}

int main()
{
    file = fopen("source.txt", "r");

    while((ch = fgetc(file)) != EOF)
    {
        if(space(ch))
        {
            printf(" %03d: %c\n", line_num++, ch);
        }
        if(letter(ch))
        {
            append(line, ch);
            printf(" %03d: %s\n", line_num++, line);
        }
        if(separator(ch))
        {
            printf(" %03d: %c\n", line_num++, ch);
        }
    }
    return 0;
}

//ch_type.h

int space(int ch)
{
    return ((ch == ' '));
}

int letter(int ch)
{
    return (((ch >= 'a') && (ch <= 'z')) || (ch >= 'A') && (ch <= 'Z'));
}


int separator(int ch)
{
    return ((ch == '#') || (ch == '(') || (ch == ')') || (ch == '{') || (ch == '}') || (ch == '[') || (ch == ']')
        || (ch == '<') || (ch == '>') || (ch == '.') || (ch == ',') || (ch == ':') || (ch == ';'));
}

1 Ответ

1 голос
/ 10 октября 2019

Печать line при вводе if(space(ch)) или if(separator(ch)) вместо нахождения каждого символа строки. После этого установите первый байт на 0, чтобы строка снова стала «пустой»:

        if(space(ch))
        {
            printf(" %03d: %s\n", line_num++, line);
            line[0] = '\0';
            printf(" %03d: %c\n", line_num++, ch);
        }
        if(letter(ch))
        {
            append(line, ch);
        }
        if(separator(ch))
        {
            printf(" %03d: %s\n", line_num++, line);
            line[0] = '\0';
            printf(" %03d: %c\n", line_num++, ch);
        }

Возможно, вам также следует добавить else к if(letter(ch)) и if(separator(ch)). Это может немного улучшить производительность, поскольку ни одно из этих условий не перекрывается.

Обратите внимание, что это предполагает, что разделители и пробелы не идут вместе, но это не обязательно имеет значение.

Здесьупрощенная версия этого, которая не требует дублированного кода:

        if(letter(ch))
        {
            append(line, ch);
        }
        else
        {
            printf(" %03d: %s\n", line_num++, line);
            line[0] = '\0';
        }
        if(space(ch) || separator(ch))
        {
            printf(" %03d: %c\n", line_num++, ch);
        }
...