c - 用 C 语言从推文中获取主题标签

标签 c string

大家好,我有一个关于 C 中字符串操作的问题。

我得到了一个文件并从中获取了推文,并要求我从字符串中获取主题标签并将其放入 avl 树中,因此我的所有 avl 函数都很好,但扫描字符串部分有点问题。

我的推文示例是hello buddies #happy

这是代码:

void read_tweet_data(avl_tree *t, char name[]) {
    FILE *data;
    data = fopen(name, "r");
    char eof, temp[140], *temp2;
    char *has, *myc;
    int i;
    while (fgets(temp, 140, data) != EOF) {
        //puts(temp);
        for (i = 0; i < strlen(temp); i++) {
            //Dont know what I should put there.
        }
    }
}

我需要扫描其中不含“#”的主题标签,并且需要您的帮助。谢谢。

最佳答案

在您的代码中,您编写:

for(i = 0; i < strlen(temp); i++) {
    //Dont know what I should put there.
}

其他人指出您不应该使用 strlen 作为循环条件;使用 temp[i] != '\0' 代替。真正的问题是您可能不想在单个循环中提取主题标签。

您正在寻找某种模式,但您事先并不知道会获得多少次点击。找到一个匹配项后,您再次查看字符串的其余部分。

因此,编写一个函数来一次处理一个推文主题标签可能是一个好主意。该函数需要一个状态变量,因此它知道上次调用时停止的位置。

生成的主题标签必须存储在某个地方。某些函数(例如 strtok)会修改原始字符串以生成以 null 结尾的子字符串,而不复制数据。此处无法完成此操作,因为主题标签可能会互相冲突#like#this,并且使用空字符覆盖第二个哈希将跳过主题标签this。因此该函数传递了一个可以填充的字符缓冲区。缓冲区大小也被传递,这样缓冲区就不会被覆盖。缓冲区中的字符串保证以 null 结尾。

一个hashtag是一个井号,后面紧跟不带重音的拉丁字符、数字和下划线。井号之后的第一个字符可能不是数字。

将所有这些放在一起:

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

int is_valid(int c, int num_allowed)
{
    if ('A' <= c && c <= 'Z') return 1;
    if ('a' <= c && c <= 'z') return 1;
    if ('0' <= c && c <= '9') return num_allowed;
    if (c == '_') return 1;
    return 0;
}

int hashtag(char **p, char buf[], size_t max)
{
    char *q;

    if (*p == NULL || **p == '\0') return 0;

    q = strchr(*p, '#');
    while (q && is_valid(q[1], 0) == 0) {
        q = strchr(q + 1, '#');
    }

    if (q) {
        size_t n = 0;

        q++;                    // skip hash sign

        while (n + 1 < max && is_valid(*q, 1)) {
            buf[n++] = *q++;
        }

        if (max) buf[n] = '\0'; // terminate buffer
        *p = q;                 // remember position

        return 1;               // hashtag found
    }

    return 0;                   // nothing found
}

以及如何使用该功能的示例:

int main()
{
    char *tweet = "#amith7951 https://t.co/eoW5q7V2Fh #net "
                  "#ajax #asp #cprogramming #sql "
                  "### ###happy#new#2016 #";

    char *p = tweet;            // state variable for hashtag function
    char tag[32];               // char buffer to store hashtag in
    int n = 0;

    while (hashtag(&p, tag, sizeof(tag))) {
        printf("[%d] %s\n", n++, tag);
    }

    return 0;
}

生成的函数可能看起来很长,但调用代码很简单。该函数还大量使用指针。您可以使用数组索引,但由于 strchr (以及许多其他库函数)无论如何都使用指针,因此在整个过程中使用指针是有意义的。

关于c - 用 C 语言从推文中获取主题标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34637583/

相关文章:

c# - 使字符串 URL 友好(例如 : convert Montréal to Montreal)

ios - Xcode - 替换String的 '< >'中的内容

java - 检查字符串是否完全显示在弹出窗口中

c# - Environment.SetEnvironmentVariable 未设置任何值

c - printf char* 指向 long 和 float 的指针

python - 我可以用 C 重写昂贵的 pygame 函数吗?

c++ - C++ getline添加空格

c - c语言中的外部和全局

c - 字节排序 HTTP 客户端

c - 如何将一个字符连接成一个字符串?