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