我的代码中的一个函数无法正常工作

问题描述 投票:0回答:1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>   
#define I 27
#define DosyaAdi "test.txt"

struct  müşteri
{
    char iban[I];
    long long tc;
    int bakiye;
};

int ibankontrol(char iban[])
{
    if(!isalpha(iban[0]) || !isalpha(iban[1]))
        return 0;
    for (int i = 2; i < 27; i++)
    {
        if (iban[i]<48 || iban[i]>57)
        {
            return 0;
        }
    }
    return 1;
}

int tckontrol(long long tc)
{
    int a=0,bas;
    long long i=1;
    while (a<11)
    {
        bas=(tc/i)%10;
        if (bas<0 || bas>9)
        {
            return 0;
        }
        
        i*=10;
        a++;
    }
    if (tc / i > 0) {
        return 0;
    }
    return 1;
}

int kaydet(struct müşteri m)
{
    FILE *dosya;
    dosya=fopen(DosyaAdi,"a");
    if (dosya==NULL)
    {
        printf("\nKayıt başarısız\n");
        return 0;
    }
    
    fprintf(dosya,"%lld %d %s\n",m.tc,m.bakiye,m.iban);

    fclose(dosya);
    return 1;
}

int havale(char kaynak[],char hedef[],int miktar)
{
    struct müşteri müşteriler[100];
    int i=0,y=0,z=0;
    char string[100];
    FILE *dosya;
    dosya=fopen(DosyaAdi,"r");
    while (1)
    {
        if ((fgets(string,100,dosya))==NULL)
        {
            break;
        }
        sscanf(string,"%lld %d %s",&müşteriler[i].tc,&müşteriler[i].bakiye,müşteriler[i].iban);
        i++;
    }   

    for(z=0;z<i;z++)
    {
        printf("\nGuncel bilgiler:\n");
        printf("%d: %s  %lld  %d\n",z+1,müşteriler[z].iban,müşteriler[z].tc,müşteriler[z].bakiye);
    }

    fclose(dosya);
    for (int j = 0; j < i; j++)
    {
        if (strcmp(kaynak,müşteriler[j].iban) == 0)
        {
            müşteriler[j].bakiye -= miktar;
            y++;
        }
        if (strcmp(hedef,müşteriler[j].iban) == 0)
        {
            müşteriler[j].bakiye += miktar;
            y++;
        }
    }

    if (y != 2)
    {
        return 0;
    }
    
    dosya = fopen(DosyaAdi, "w");
    if (dosya == NULL)
    {
        printf("Dosya açılamadı.\n");
        return 0;
    }
    
    for (int s = 0; s < i; s++)
    {
        fprintf(dosya, "%lld %d %s", müşteriler[s].tc, müşteriler[s].bakiye, müşteriler[s].iban);
        if (s!=i-1)
        {
            printf("\n");
        }
        
    }
    fclose(dosya);
    
    return 1;
}


int main()
{
    int seçim;
    int dönüş=0,kontrol=0;
    char kaynak[27],hedef[27];
    int miktar=0;
    struct müşteri m;

    while (1)
    {
        printf("Menü:\n");
        printf("1:Kayıt\n");
        printf("2:Havale\n");
        printf("3:Çıkış\n");
        printf("Seçiminiz: ");
        scanf("%d",&seçim);

        switch (seçim)
        {
        case 1:
       
            while (1)
            {
                printf("İban giriniz: ");
                scanf("%s",m.iban);
                fflush(stdin);
                dönüş=ibankontrol(m.iban);
                if (dönüş==0)
                {
                    printf("İban yanlış");
                }
                else if (dönüş==1)
                {
                    break;
                }
            }
            while (1)
            {
                printf("TC giriniz");
                scanf("%lld",&m.tc);
                dönüş=tckontrol(m.tc);
                if (dönüş==0)
                {
                    printf("TC yanlış");
                }
                else if (dönüş==1)
                {
                    break;
                }
            }
            
            printf("Bakiye giriniz");
            scanf("%d",&m.bakiye);

            kontrol=kaydet(m);
            if (kontrol==0)
            {
                printf("Kayıt başarısız");
            }
            else if (kontrol==1)
            {
                break;
            }
            break;
        case 2:
            printf("Kaynak iban: ");
            scanf("%s",kaynak);
             
            fflush(stdin);
            
            printf("Hedef iban: ");
            scanf("%s",hedef);
   
            fflush(stdin);

            printf("Gönderilicek miktar: ");
            scanf("%d",&miktar);

            int a=havale(kaynak,hedef,miktar);
            if (a==0)
            {
                printf("Havale başarısız\n");
            }
            break;
        case 3:
            exit(2);
            break;
        default:
            printf("geçersiz işlem");
            break;
        }
    }
    return 0;
}

在我的代码中,当输入信息时,我将其处理到文件中,然后,在进行传输时,我删除该文件并在交易后将其写回到文件中。虽然在我的代码中正确执行了注册过程,但转账交易并未正确发生。我认为这是一个空白字符,但你觉得呢?

c algorithm sorting
1个回答
0
投票

写入文件时,

iban
字段后面没有分隔符。因此,当您尝试从文件中读取时,下一项的
tc
将被读取为
iban
的一部分,并且您将失去同步。

将每个项目写入不同的行。换行符将终止读取

iban

fprintf(dosya, "%lld %d %s\n", müşteriler[s].tc, müşteriler[s].bakiye, müşteriler[s].iban);
© www.soinside.com 2019 - 2024. All rights reserved.