我是C的新手,不确定我该怎么做。我发现了类似的问题,但没有我想要的。
我想做的是读取一个原始的txt文件"句子",句子的结尾被视为(。(或newline( n(。任何数据结构都没有假定的最大长度。
我的第一个想法是getline()
,但是我需要使用的C版本似乎没有这样的功能。因此,我尝试使用fgets()
,然后将数据解析到带有SCANSET的sscanf()
上。sscanf(charLine, "%[^.]s", sentence);
问题的问题是,如果有一个以上的时期(。(将停止在第一个时期,而在此期间不再开始(。(收集其他时期。
我觉得自己在正确的轨道上,但不是如何对此进行扩展。
while(fgets (charLine, size, readFile) == NULL)
{
sscanf(charLine, "%[^.]s", sentence);
// something here...
}
您可以编写一个读取流的函数,直到找到.
或newline。David C.Rankin建议仅扫描.
可能太限制了,从而导致www.google.com中的嵌入式时期充当句子中断。如果是空间,则可以在.
上停止:
#include <ctype.h>
#include <stdio.h>
/* alternative to fgets to stop at `.` and newline */
char *fgetsentence(char *dest, size_t size, FILE *fp) {
size_t i = 0;
while (i + 2 < size) {
int c = getc(fp);
if (c == EOF)
break;
dest[i++] = (char)c;
if (c == 'n')
break;
if (c == '.') {
int d = getc(fp);
if (d == EOF)
break;
if (isspace(d)) {
dest[i++] = (char)d;
break;
}
ungetc(d, fp);
}
}
if (i == 0)
return NULL;
dest[i] = ' ';
return dest;
}
如果要处理任意的长句子,则将指针带到dest
和size
,并在需要时重新分配数组。
请注意,使用fscanf(fp, "%[^.n]", dest)
是非常不切实际的,因为无法将最大的字节传递到dest
中,作为评估的参数,并且需要特殊情况的空排和句子。
也请注意,即使在上述限制下,必须在.
上停止,即必须遵循空白,仍然会导致假阳性:句子可以包含嵌入式期间,然后是句子不是句子末端的空白。示例:感谢David C. Rankin对我的答案的评论。