gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:52:37 24 4
gpt4 key购买 nike

大家好,我有一个关于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com