使用fscanf时,我可以在c中将非字母字符设置为分隔符吗?

时间:2018-03-05 19:07:51

标签: c string scanf delimiter

我尝试使用

从文件中读取字符串
while(fscanf(fd, "%s ", word) != EOF) {}

其中fd是文件,而word是我存储字符串的地方。 但是,这有效地使用空格作为分隔符。目前,如果我有一个文件读取"这个%是,4 str%ng"它会产生字符串"这个%","是,"," the4"和" str%ng"。我需要它"这个" "是" "所述" " STR" " NG&#34 ;.是否可以使用fscanf执行此操作,还是需要使用其他内容?

我看到了一些答案herehere,但他们似乎并没有帮助我。

2 个答案:

答案 0 :(得分:3)

这些答案显示了"%[]格式说明符的使用。举个例子,假设你有这个从控制台获取两个字符串:

#include <stdio.h>

int main(void){
    char s1[100] = "", s2[100] = "";
    int res;

    res = scanf("%99[^%]%%%99[^%]%%", s1, s2);
    printf("%d %s %s\n", res, s1, s2);
}

第一个%启动每个格式规范,^%告诉scanf停在%,下一个&#34;转义&#34; double %告诉scanf读取停止扫描的%。然后重复第二个字符串,因此一个字符串的格式规范为%99[^%]%%

为了使格式看起来更简单,假设分隔符不是%而是#,那么代码将是:

#include <stdio.h>

int main(void){
    char s1[100] = "", s2[100] = "";
    int res;

    res = scanf("%99[^#]#%99[^#]#", s1, s2);
    printf("%d %s %s\n", res, s1, s2);
}

函数fscanf类似。

<小时/> 编辑

这个答案没有处理&#34;未知&#34;分隔符,所以我修改了代码。

#include <stdio.h>

int main(void){
    char s1[100] = "";
    while(scanf("%99[^!£$%&*()_-+={};:'@#~,.<>/?0123456789]", s1) == 1) {
        getchar();                      // remove the delimiter
        printf("%s\n", s1);
    }
}

注意我没有将字符^"[]作为分隔符。

答案 1 :(得分:1)

如果您没有特定的分隔符(似乎是您的情况),则需要手动解析每个文件行。您可以使用fgets()读取每一行,然后手动解析(例如,忽略每个非字母字符)。

此致