【问题标题】:Using switch case for different types of `fscanf()`对不同类型的 `fscanf()` 使用 switch case
【发布时间】:2017-01-01 12:15:04
【问题描述】:

问题:

我编写了一个 C 程序,它应该遍历输入文件并在布局相同的表格中显示其表格内容,除了与输入文件不同的是,输出的值应该在漂亮的均匀选项卡列中。

我正在阅读的文本文件有以下内容:

姓名姓氏123 4.2 f
萨拉 dddd 222 3.2 f
丹 SSSS 1233 1.3 米
安 aaaa 443 2.2 f

但是输出错误:

注意不需要的换行,应该在最后一列显示的值变成下一行的第一列。

程序:

    int i, j;
    char c;
    double d;
    char str[10];
    char t[6]="ssidc"; //Encoded column types descriptor (e.g. string, string, int, double, char"

    while(!feof(fa)) {

    for(i = 0; i < 5; i++) {
        switch(t[i]) {
            case('s'): 
                fscanf(fa,"%s",str);
                printf("%s\t",str);
                break;
            case('c'):
                fscanf(fa,"%c",&c);
                printf("%c\t",c);
                break;
            case('d'):
                fscanf(fa,"%lf",&d);
                printf("%.1lf\t",d);
                break;
            case('i'):
                fscanf(fa,"%d",&j);
                printf("%d\t",j);
                break;
            default:
                break;
        }
    }
    printf("\n");//new line
}

【问题讨论】:

  • 您是否在调试器中运行代码以逐行跟踪程序,检查相关变量的值以了解实际情况?
  • 尝试对 'c' 使用格式“%c”。
  • 如果您使用空格进行分隔,请考虑明确跳过所有空格(例如,在for 的末尾使用fgetc(3))或尝试使用fgets(3)strtok(3)。后一种方法的文件操作较少,因此速度更快。您还有一个地址范围,您的所有字符串都存储用于任意操作(例如解析),从而使代码更加直观/明显(至少对某些人来说)。

标签: c file text switch-statement scanf


【解决方案1】:

scanf("%c" 读取任何字符,但是当您调用它时,当前位置在一个空格上(您刚刚解析了一个浮点数),然后它被读取为一个字符。您需要通过提供扩展格式处理指令来跳过它:

fscanf(fa,"%*[ ]%c",&c);

阅读scanf 手册以了解其工作原理。

【讨论】:

  • 如果读取的第一个字符是'\n'fscanf(fa,"%*[ ]%c",&amp;c); 将出现问题。推荐fgets()
  • 然后他可以使用"%*[ \n]%c"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 2013-07-10
相关资源
最近更新 更多