我正在尝试从包含以下句子的.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,我想稍后考虑一下,现在我想用空话来解决问题。
编译和执行
' '
答案 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
,那么它就是一个单词的结尾。然后你可以在两个单词之间加上每个字母,你仍然可以干净利落地发现这个单词。