【问题标题】:Read char with sscanf用 sscanf 读取字符
【发布时间】:2017-07-10 02:19:40
【问题描述】:

我正在尝试从文件寄存器加载结构。当我尝试扫描一个字符时,我得到一个空格。文件寄存器的格式如下:

accountNumber(char 8) code(char 1) 余额(float 9位2decimals)

例子:

AAAA1111 C 500000,05

当我尝试获取该示例寄存器时,我得到:

AAAA1111 500000,05

typedef struct{
    char accountNum[8];
    char cod;
    float balance;
}t_regMov;

void loadStruct(char *line,t_regMov *mov){
    char *aux=line;
    aux=strchr(line,'\n');
    *aux='\0';
    aux-=9;
    sscanf(aux,"%f",&mov->balance);
    aux-=1;
    *aux='\0';
    aux-=1;
    sscanf(aux,"%c",&mov->cod);
    aux-=1;
    *aux='\0';
    sscanf(line,"%s",mov->accountNum);
}

int main(){
    FILE *movf=fopen("movements.txt","r+");
    if(!movf)exit(1);
    t_regMov mov;
    char line[100];

    fgets(line,sizeof(line),movf);
    while(!feof(movf)){
        loadStruct(line,&mov);
        printf("%s %c %f\n",mov.accountNum,mov.cod,mov.balance)
        fgets(line,sizeof(line),movf);
    }
    fclose(movf);
}

【问题讨论】:

  • char accountNum[8]; --> char accountNum[8+1];
  • 由于您知道确切的行格式,sscanf() 似乎有点过头了。我建议使用memcpy()atof() 去除您需要的位而不是sscanf()。在我从事的更大项目中,我已经用结构更丰富的东西和我可以使用的库替换了所有文本文件格式。例如XML 和 JSON。如果您需要更线性的东西,必须有一个好的 CSV 库可以使用?使用专业文本文件很容易导致维护混乱。
  • 也可能float不够准确。
  • "%c" --> " %c"(加空格)

标签: c file scanf


【解决方案1】:

这是一个解析你想要的行的简化示例。

#include <stdio.h>
#include <string.h>


int main() {
        int left, right;
        char *accountNumber;
        char cod;
        sscanf("AAAA1111 C 500000,05", "%8s %c %d,%d", accountNumber, &cod,&left, &right);
        printf("Account: %s\nCode: %c\nBalance: %d,%d\n", accountNumber, cod, left, right);
}

最大的变化是在您的sscanf 中,您可以为字符串缓冲区指定最大字符数。就像上面的注释一样,您需要为您的字符串(空终止和所有)分配适量的空间。

【讨论】:

  • char accountNum[8];char *accountNumber;"%8s" --> 问题。 accountNum[] 太小了。
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 2012-11-10
  • 2012-06-06
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2019-04-10
相关资源
最近更新 更多