【问题标题】:How to append a char into array and tokenize it C如何将字符附加到数组中并对其进行标记C
【发布时间】:2019-10-09 23:33:11
【问题描述】:

在我的主要功能中,我使用的是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' 拆分它?它不应该已经将其拆分为append 函数中的初始'\0' 吗?我是否朝着正确的方向发展?为了在 null 之后进行拆分,我是否缺少一些东西?

//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 == ';'));
}

【问题讨论】:

  • 今后,请发布输入/输出的文本,而不是输入/输出的图片。这允许其他人验证您的结果,并且您有 200-300 个字符的存储空间,您的第二张图像单独 aOXPB.png 需要 13534 字节来存储 :)
  • 会的。我没有意识到这一点。谢谢

标签: c arrays string char


【解决方案1】:

当您输入if(space(ch))if(separator(ch)) 时打印line,而不是在找到一行的每个字符之后。之后,将第一个字节设置为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);
        }

您可能还应该在if(letter(ch))if(separator(ch)) 前面加上else。这可能会稍微提高性能,因为这些条件都不重叠。

请注意,这是假设分隔符和空格不在一起,但这不一定重要。

这是一个不需要重复代码的简化版本:

        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);
        }

【讨论】:

  • 有没有办法将实际字母作为一个整体存储?现在 null 之前的 printf 在将其归零之前打印前面的字母等。但是当没有字母时,格式化会有点棘手。为简单起见,当我询问时,我没有将数字(ch)、运算符(ch)等添加到上面的代码中。似乎假设字母字符总是在其他字符之前? space(ch) 和 neli(ch) aka '\n' 开始变得有趣。我尝试使用 strcmp 函数将字母与另一个具有初始化关键字的数组进行比较,该关键字有效但重复。
  • @Lordravenblack 您可以提出另一个问题并提供指向此问题的链接以提供上下文。
猜你喜欢
  • 2023-04-03
  • 2020-03-06
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
相关资源
最近更新 更多