繁体   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