c - 使用 sscanf 读取字符

标签 c file scanf

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

账户号码(字符8)代码(字符1)余额( float 9位2小数)

示例:

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);
}

最佳答案

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

#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 中,您可以指定字符串缓冲区的最大字符数。就像上面的注释一样,您需要为字符串分配适量的空间(空终止和所有)。

关于c - 使用 sscanf 读取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45002918/

相关文章:

Char 双向链表

c - 读取任意内存位置使程序崩溃

php - 文件在服务器上消失

c - scanf如何判断是否阻塞?

将字符串转换为十六进制

c - 为什么以下程序在获取数组中的输入后停止工作?

c - 从排序文件构建二叉搜索树会出现段错误

c - 如何在循环(范围)的 if 语句中使用此变量

node.js - 如何使用node.js在两台计算机之间共享本地文件?

regex - 使用具有精确数字的正则表达式查找文件