簡體   English   中英

循環中的值不返回

[英]value in loop doesnt return

我在文件中有此數據

ATOM      1  N   MET A   1      25.909  16.164  -8.037
ATOM      2  CA  MET A   1      25.498  14.786  -8.206
ATOM      3  C   MET A   1      26.612  13.934  -8.806
ATOM      4  O   MET A   1      27.442  14.402  -9.588

這是我的完整代碼

#include<stdio.h>
#include<math.h>
typedef struct prot {
    char atom[10];
    int atomno;
    char site[10];
    char residue[10];
    char chain;
    int residueno;
    float x, y, z;
} Td;
 int main()
 {
    FILE*fd;
    fd=fopen("2zoi.pdb","r+");
    Td data[1300];
    char buffer[1300];
    int a=0;


    while(fgets(buffer, 1300, fd))
    {
        sscanf(buffer, "%s %d %s %s %c %d %f %f %f",data[a].atom,&data[a].atomno,data[a].site,
               data[a].residue,&data[a].chain,&data[a].residueno,&data[a].x, &data[a].y, &data[a].z);

        printf("%s %d %s %s %c %d %6.3f %6.3f %6.3f \n",data[a].atom,data[a].atomno,data[a].site,
               data[a].residue,data[a].chain,data[a].residueno,data[a].x, data[a].y, data[a].z);
        a++;
    }

    //---user input

    int fr,sr;
    int fa,sa;
    int i=0;
    float x1,x2,y1,y2,z1,z2;
    float distance=0;

    printf("Enter first no of atom :");
    scanf("%d",&fa);

    printf("Enter second no of atom :");
    scanf("%d",&sa);


while(data[i].atomno>=0)
{
    if(fa==data[i].atomno)
    {
        x1=data[i].x;
        y1=data[i].y;
        z1=data[i].z;
    }

    else if(sa==data[i].atomno)
    {
        x2=data[i].x;
        y2=data[i].y;
        z2=data[i].z;
    }
    i++;

}
printf("%f %f %f",x1,y1,z1);
printf("%f %f %f",x2,y2,z2);
    //distance= sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2) + pow((z2 - z1), 2));
    //printf("%6.3f",distance);
    return 0;
 }

問題就在這部分

 printf("%f %f %f",x1,y1,z1);
 printf("%f %f %f",x2,y2,z2);

我嘗試從上述循環返回值,其中x1,y1,z1的值是第一個原子,x2,y2,z2的值是第二個原子。

當我輸入3和4時,它會給出答案

26.612  13.934  -8.806
27.442  14.402  -9.588

哪個是對的。 但是當我輸入1和2時,它給出了垃圾答案。 好像我不能輸入數字2也是數字10。我做錯了嗎?

data數組值存在一個大問題:並非數組的所有元素都設置為0,則最終循環可能會中斷。 您可以使用memsetdata數組的所有字節重置為0。

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

typedef struct prot
{
    char atom[10];
    int atomno;
    char site[10];
    char residue[10];
    char chain;
    int residueno;
    float x, y, z;
} Td;

int main()
{
    FILE*fd;
    Td data[1300];
    char buffer[1300];
    size_t a=0;

    fd=fopen("2zoi.pdb","r+");
    if (fd != NULL)
    {
        memset(data, 0x00, sizeof(data));

        while ((fgets(buffer, 1300, fd)) && (a < sizeof(data)/sizeof(data[0])))
        {
            sscanf(buffer, "%s %d %s %s %c %d %f %f %f",data[a].atom,&data[a].atomno,data[a].site,
                   data[a].residue,&data[a].chain,&data[a].residueno,&data[a].x, &data[a].y, &data[a].z);

            printf("%s %d %s %s %c %d %6.3f %6.3f %6.3f \n",data[a].atom,data[a].atomno,data[a].site,
                   data[a].residue,data[a].chain,data[a].residueno,data[a].x, data[a].y, data[a].z);
            a++;
        }

        //---user input

        int fr,sr;
        int fa,sa;
        size_t i=0;
        float x1,x2,y1,y2,z1,z2;
        float distance=0;

        printf("Enter first no of atom :");
        scanf("%d",&fa);

        printf("Enter second no of atom :");
        scanf("%d",&sa);

        while ((data[i].atomno>=0) && (i < sizeof(data)/sizeof(data[0])))
        {
            if(fa==data[i].atomno)
            {
                x1=data[i].x;
                y1=data[i].y;
                z1=data[i].z;
            }

            else if(sa==data[i].atomno)
            {
                x2=data[i].x;
                y2=data[i].y;
                z2=data[i].z;
            }
            i++;

        }
        printf("%f %f %f\n",x1,y1,z1);
        printf("%f %f %f\n",x2,y2,z2);
    }
    else
    {
        fprintf(stderr, "Error opening file\n");
        exit(1);
    }

    return 0;
 }

您應該檢查fopen返回值(如在發布的代碼中看到的那樣),但是作為標准規則:您應該始終檢查函數的返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM