我想使用此函数计算文件中每行的单词数,@ params line_number是文件包含的行数。
当我尝试解析此文件时:
world hello
hello world
hello hello
world salut
我得到了矢量的这些结果
vector[0] = 2
vector[1] = 2
vector[2] = 2
vector[3] = 1
vector[4] = 2
我的代码出了什么问题?如果一行上没有单词,我怎么能停止获得1而不是0?
int * get_vtor(FILE *file, int line_number)
{
int *vtor = malloc(line_number*sizeof(int)), max, j, k, u;
char a_file_line[TAILLE_MAX_LINE]; // TAILLE_MAX_LINE is #define earlier to 100
j = k = u = max = 0;
rewind(file);
while((fgets(a_file_line, TAILLE_MAX_LINE ,file)) != NULL)
{
char * current = strtok(a_file_line," ");
while(current != NULL)
{
u++;
current = strtok(NULL, " ");
}
*(vtor+j) = u;
u = 0; j++;
memset(a_file_line, 0 , sizeof(a_file_line));
}
return vtor;
}
答案 0 :(得分:0)
你确定该行真的是空的并且没有换行符吗?当我在本地测试strtok
时,它永远不会返回空字符串。但是,fgets
不会从字符串中删除尾部换行符,因此您的代码将其视为“一个单词”。
您可以通过将strtok调用中的分隔符字符串更改为" \n"
而不是" "
来解决此问题。
次要风格说明:我不知道是谁教这种语法,但是不必要地阅读:
*(vtor+j) = u;
你可以更清楚地写出:
vtor[j] = u;
答案 1 :(得分:0)
首先猜测,因为您正在阅读标准输入 基本上每一行都以“新行”字符结束 更多细节解决方案可以在这里找到: Reading c file line by line using fgetc()
答案 2 :(得分:0)
因为你正在使用'strtok',如果第一次点击中没有令牌,它总是返回整个字符串。所以对于空行你会得到'\ n'。
只需过滤它即可获得正确的结果。
while(current != NULL && *current != '\n')
答案 3 :(得分:0)
在fgets后删除换行符:
while((fgets(a_file_line, 100 ,file)) != NULL)
{
a_file_line[strlen(a_file_line) - 1] = 0;
它将换行计为单词,因为当您拆分非空字符串时,即使没有分隔符,它也总是有一个标记。