C 文件处理fprintf错误

C 文件处理fprintf错误,c,C,我得到了一个关于文件处理的作业,它是关于创建银行账户的,然后它告诉你输入你的账号、姓名、pin和初始余额。我的程序确实有效,但它在文件上打印错误。我该怎么办 节目: #include<stdio.h> #include<conio.h> #include<windows.h> #include<ctype.h> struct accacc { char accno[5]; char accna[50];

我得到了一个关于文件处理的作业,它是关于创建银行账户的,然后它告诉你输入你的账号、姓名、pin和初始余额。我的程序确实有效,但它在文件上打印错误。我该怎么办

节目:

#include<stdio.h>  
#include<conio.h>  
#include<windows.h>  
#include<ctype.h>  

struct accacc
{  
    char accno[5];  
    char accna[50];  
    int accpin[4];  
    int accba;  
};  
main()
{  
    FILE *fp;  
    struct accacc acc;  
    char ch;  
    char t[5];  
    fp=fopen("Accounts.txt","a");  
    printf("ENTER ACCOUNT NUMBER:\t");  
    gets(acc.accno);  
    printf("ENTER ACCOUNT NAME:\t");  
    scanf("\n");  
    gets(acc.accna);  
    printf("ENTER ACCOUNT PIN:\t");  
    scanf("%d",&acc.accpin);  
    printf("ENTER INITIAL BALANCE:\t");  
    scanf("%d",&acc.accba);  
    printf("CREATE ANOTHER ONE?:\t");  
    scanf(" %c",&ch);  
    fprintf(fp,"%s\t%s\t%d\t%d",acc.accno,acc.accna,acc.accpin,acc.accba);  
    if(toupper(ch)=='Y')
    {  
        do
        {
            system("cls");  
            printf("ENTER ACCOUNT NUMBER:\t");  
            scanf("\n");  
            gets(t);  
            if(strcmp(acc.accno,t)==0)
            {   
                printf("ACCOUNT ALREADY EXISTS!");  
            }
            else
            {
                printf("ENTER ACCOUNT NAME:\t");  
                scanf("\n");  
                gets(acc.accna);  
                printf("ENTER ACCOUNT PIN:\t");  
                scanf("%d",&acc.accpin);  
                printf("ENTER INITIAL BALANCE:\t");  
                scanf("%d",&acc.accba);  
                printf("CREATE ANOTHER ONE?:\t");  
                scanf(" %c",&ch );  
                fprintf(fp,"%s\t%s\t%d\t\t%d\t\n",t,acc.accna,acc.accpin,acc.accba);  
            }
        }while(toupper(ch)=='Y');  
    }  
    else
    {  
        fclose(fp);  
    }  
    getch();  
}
#包括
#包括
#包括
#包括
结构accacc
{  
char-accno[5];
char-accna[50];
int-accpin[4];
阿克巴国际酒店;
};  
main()
{  
文件*fp;
结构acc;
char ch;
chart[5];
fp=fopen(“Accounts.txt”,“a”);
printf(“输入账号:\t”);
获取(acc.accno);
printf(“输入帐户名:\t”);
scanf(“\n”);
获取(acc.accna);
printf(“输入账户密码:\t”);
scanf(“%d”和accpin);
printf(“输入初始余额:\t”);
scanf(“%d”和accba);
printf(“创建另一个?:\t”);
scanf(“%c”和“ch”);
fprintf(fp,“%s\t%s\t%d\t%d”,acc.accno,acc.accna,acc.accpin,acc.accba);
if(toupper(ch)='Y')
{  
做
{
系统(“cls”);
printf(“输入账号:\t”);
scanf(“\n”);
获取(t);
如果(strcmp(acc.accno,t)==0)
{   
printf(“帐户已存在!”);
}
其他的
{
printf(“输入帐户名:\t”);
scanf(“\n”);
获取(acc.accna);
printf(“输入账户密码:\t”);
scanf(“%d”和accpin);
printf(“输入初始余额:\t”);
scanf(“%d”和accba);
printf(“创建另一个?:\t”);
scanf(“%c”和“ch”);
fprintf(fp,“%s\t%s\t%d\t\t%d\t\n”,t,acc.accna,acc.accpin,acc.accba);
}
}while(toupper(ch)='Y');
}  
其他的
{  
fclose(fp);
}  
getch();
}

您传递了
acc.accpin
,它被转换为
int*
,函数参数在
fprintf()
中调用
int
,因此您调用了未定义的行为

修复其他问题时,您的代码可能如下所示:

#include<stdio.h>
#include<stdlib.h> /* add this to use system() */
#include<string.h> /* add this to use strcmp() */
#include<ctype.h>

struct accacc{
    char accno[5];
    char accna[50];
    int accpin; /* change type from int[4] to int */
    int accba;
};

char* safer_gets(char* outbuf, size_t max){
    size_t idx = 0;
    int input;
    if(max == 0) return NULL;
    while(idx + 1 < max && (input = getchar()) != EOF && input != '\n'){
        outbuf[idx++] = input;
    }
    if (idx == 0 && input == EOF) return NULL;
    outbuf[idx] = '\0';
    return outbuf;
}

int main(void){
    FILE *fp;
    struct accacc acc;
    char ch;
    char t[5];
    fp=fopen("Accounts.txt","a");
    if(fp == NULL){ /* add error check */
        perror("fopen");
        return 1;
    }
    /* stop using gets() and add error check for input */
    printf("ENTER ACCOUNT NUMBER:\t");
    if(safer_gets(acc.accno,sizeof(acc.accno)) == NULL){
        fputs("input error\n", stderr);
        return 1;
    }
    printf("ENTER ACCOUNT NAME:\t");
    scanf("\n");
    if(safer_gets(acc.accna,sizeof(acc.accna)) == NULL){
        fputs("input error\n", stderr);
        return 1;
    }
    printf("ENTER ACCOUNT PIN:\t");
    if(scanf("%d",&acc.accpin) != 1){
        fputs("input error\n", stderr);
        return 1;
    }
    printf("ENTER INITIAL BALANCE:\t");
    if(scanf("%d",&acc.accba) != 1){
        fputs("input error\n", stderr);
        return 1;
    }
    printf("CREATE ANOTHER ONE?:\t");
    if(scanf(" %c",&ch) != 1){
        fputs("input error\n", stderr);
        return 1;
    }
    fprintf(fp,"%s\t%s\t%d\t%d",acc.accno,acc.accna,acc.accpin,acc.accba);
    if(toupper(ch)=='Y'){
        do{
            system("cls");
            printf("ENTER ACCOUNT NUMBER:\t");
            scanf("\n");
            safer_gets(t,sizeof(t));
            if(strcmp(acc.accno,t)==0){ 
                printf("ACCOUNT ALREADY EXISTS!");
            }
            else {
                printf("ENTER ACCOUNT NAME:\t");
                scanf("\n");
                if(safer_gets(acc.accna,sizeof(acc.accna)) == NULL){
                    fputs("input error\n", stderr);
                    return 1;
                }
                printf("ENTER ACCOUNT PIN:\t");
                if(scanf("%d",&acc.accpin) != 1){
                    fputs("input error\n", stderr);
                    return 1;
                }
                printf("ENTER INITIAL BALANCE:\t");
                if(scanf("%d",&acc.accba) != 1){
                    fputs("input error\n", stderr);
                    return 1;
                }
                printf("CREATE ANOTHER ONE?:\t");
                if(scanf(" %c",&ch ) != 1){
                    fputs("input error\n", stderr);
                    return 1;
                }
                fprintf(fp,"%s\t%s\t%d\t\t%d\t\n",t,acc.accna,acc.accpin,acc.accba);
            }
        }while(toupper(ch)=='Y');
        fclose(fp); /* add fclose() here */
    }
    else{
        fclose(fp);
    }
}
#包括
#include/*将此添加到使用系统()中*/
#include/*添加此项以使用strcmp()*/
#包括
结构accacc{
char-accno[5];
char-accna[50];
int accpin;/*将类型从int[4]更改为int*/
阿克巴国际酒店;
};
char*safer\u获取(char*EXBUF,最大大小){
大小\u t idx=0;
int输入;
如果(max==0)返回NULL;
而(idx+1

请注意,此代码中的“检查重复帐号”无效。

注意
accpin
int
数组。您确实需要学习缩进代码。您发布的内容是一场噩梦。请提供您的输入、输出和预期输出。不要使用
gets
,使用
fgets
“我的程序确实工作,但它在文件上打印错误”。这是什么意思?你的程序可以工作,但不能工作?请澄清您的程序的确切行为-包括输入、预期输出/结果和实际输出/结果。