我正在尝试从文本文件中读取非数字单词,这些单词可以用逗号、点、冒号或引号或诸如“之类的某种组合分隔。到目前为止我尝试的代码正在读取非数字单词字 正确,但保留分隔符。我使用 fscanf() 对吗?
int ReadWords(FILE* fp, char *words[])
{
int i=0;
char temp[50],tmp[50]; // assuming the words cannot be too long
while (fscanf(fp,"%s%*[,.\":]",temp)==1) //ignore punctuation
{
if (isNumeric(temp))
continue;
printf("%s\n",temp);
words[i] = strdup(temp);
i++;
}
fclose(fp);
// The result of this function is the number of words in the file
return i;
}
我得到的输出类似于
emergency,"
"an
unknown
car
entered,
我需要这样
emergency
an
unknown
car
entered
最佳答案
%s
格式扫描“单词”,即连续的非空间 block 。这包括标点符号。
您想要扫描非数字单词,即仅扫描字母字符。对于这些字符,您可以像标点符号一样使用 %[...]
格式:
while (fscanf(fp, "%49[a-zA-Z]%*[^a-zA-Z]", temp) == 1) ...
注意事项:
- 减号定义括号中的字符范围,除非它是第一个或最后一个字符,因此
%[a-zA-Z]
会扫描不带重音的拉丁字母。 - 我在格式中添加了最大字长 49,这样就不会溢出字符缓冲区。
- 我将除字母以外的任何内容都视为标点符号。这是一个简单的假设,但它将您的输入整齐地划分为字母/标点符号序列。您可以使用插入符号
^
作为括号内的第一个字母来否定要包含的字母。 - 您可能应该首先扫描标点符号(可能是空的),以便真正的扫描以字母开头。
关于c - 使用 fscanf() 获取格式化输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26419108/