代码之家  ›  专栏  ›  技术社区  ›  Morpen

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

  •  0
  • Morpen  · 技术社区  · 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;
    }
    

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

    2 回复  |  直到 1 年前
        1
  •  1
  •   Barmar    1 年前

    写入文件时,在 iban 领域因此,当您尝试从文件中读取时,下一项 tc 将作为的一部分阅读 iban ,您将失去同步。

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

    fprintf(dosya, "%lld %d %s\n", müşteriler[s].tc, müşteriler[s].bakiye, müşteriler[s].iban);
    
        2
  •  0
  •   Joop Eggen    1 年前

    打印a \n 最后一行也是,然后用换行符扫描。此外,您也没有检查tc是否为负值。

    IBAN不为终止预留空间 '\0' ,也没有对终止进行检查,比如 strlen 。所以printf和scanf会出错。