C从txt文件中提取单词,除了空格和标点符号

时间:2018-04-18 10:42:33

标签: c arrays string text char

我正在尝试从包含以下句子的.txt文件中提取单词

  

Quando avevo cinqve anni,mia made mi perpeteva semper che la felicita e la chiave della vita。 Quando andai a squola mi domandrono来自vuolessi essere da grande。 Io scrissi:selice。 Mi dissero che non avevo capito il corpito,e io dissi loro che non avevano capito la wita。

问题在于,在我用来存储单词的数组中,它还存储了空单词' ',这些单词始终位于以下',' '.' {{1}之一之后}

我知道像“空话”或“空字符”之类的东西没有意义,但请尝试使用我已经通过的文字代码并且你会理解。

与此同时,我试图理解':'与此修饰符sscanf的使用,这应该允许我存储忽略sscanf(buffer, "%[^.,:]");.以及{{1}的字符串但是我不知道,应该在:写什么来忽略总是被保存的空字符i

代码如下

%[^]

我知道我应该只存储必要的数字和单词,而不是每次只存储100,我想稍后考虑一下,现在我想用空话来解决问题。

编译和执行

' '

2 个答案:

答案 0 :(得分:1)

您可以尝试使用strtok

fgets(buffer,buf_size,fp);
for (char* tok = strtok(buffer,".,: "); *tok; tok = strtok(NULL,".,: "))
{
   printf("%s\n", tok);
}

注意如果要存储strtok返回的内容,则需要复制tok指向的内容或使用strdup / malloc + strcpy分配副本因为strtok在解析字符串时修改了第一个参数的副本。

答案 1 :(得分:0)

您忘记在每个'\0'行中添加最终a,并且您的算法存在许多缺陷(例如每次出现非字母时如何增加j。如果你有", "怎么办?你增加两次而不是一次。

一种“简单”的方式是使用“strtok”,正如Anders K.给你看的那样。

fgets(buffer,buf_size,fp);
for (char* tok = strtok(buffer,".,:"); *tok; tok = strtok(NULL,".,:")) {
   printf("%s\n", tok);
}

该函数的“问题”是您必须指定所有分隔符,因此您必须添加' '(空格),'\t'(制表)等等。

由于您只想要“仅包含字母,小字母或大字”所描述的“字”,因此您可以执行以下操作:

int main(void)
{
    char line[] = "Hello ! What a beautiful day, isn't it ?";

    char *beginWord = NULL;

    for (size_t i = 0; line[i]; ++i) {
        if (isalpha(line[i])) { // upper or lower letter ==> valid character for a word
            if (!beginWord) {
                // We found the beginning of a word
                beginWord = line + i;
            }
        } else {
            if (beginWord) {
                // We found the end of a word
                char tmp = line[i];
                line[i] = '\0';
                printf("'%s'\n", beginWord);
                line[i] = tmp;
                beginWord = NULL;
            }
        }
    }

    return (0);
}

请注意,“isn”和“t”中的“is not”是如何分开的,因为'不是您单词的重要角色。

算法很简单:我们只是循环字符串,如果它是一个有效的字母和beginWord == NULL,那么它就是单词的开头。如果它不是有效的字母和beginWord != NULL,那么它就是一个单词的结尾。然后你可以在两个单词之间加上每个字母,你仍然可以干净利落地发现这个单词。