IF语句无法检查正确的值

时间:2017-05-28 21:00:03

标签: c if-statement

我有一个函数将字符串坐标转换为0-9的int数。 现在该函数似乎无法获取字符串A10(例如)并将其转换为0,9。也许有人可以告诉我为什么?

Point TranslateCoordinate(char* c){
        Point newpoint;
        newpoint=malloc(sizeof(Point));//this is beacuse its an ADT
        int row=c[0];
        int column;
        newpoint->x=row-'A';
        if(c[1]== '1' && c[2]== '0'){
            newpoint->y=9;
            return newpoint;
        }
        column=c[1];
        newpoint->y=column-'1';
        return newpoint;
}

我应该注意,字符串的值范围从110以及从AJ。 这也是main函数的调用;它从文件中获取一个字符串,并将其分配给一个名为submarine的结构。

while(fgets(buffer,100,fptr))
{
    if(isalpha(buffer[0]))
    {
        token=strtok(buffer,"-");
        start=TranslateCoordinate(token);
        token=strtok(NULL,"\n");
        end=TranslateCoordinate(token);
        s=Makesub(start,end,9);
        P1list=Add_to_list(s,P1list);
    }
}

结构本身如源于:

struct Point_s
{
    int x;
    int y;
};

标题中写入的typedef:

typedef struct Point_s* Point;

2 个答案:

答案 0 :(得分:4)

    Point newpoint;
    newpoint=malloc(sizeof(Point));

这可能不正确。

Point似乎被typedefed成为指向某个struct的指针。这本身就是糟糕的风格,会给你带来麻烦。如果你想保留它,最简单的正确调用顺序是

    newpoint = malloc(sizeof(*newpoint));

即使没有指针typedef,我认为这也是一个很好的全能风格,所以我建议总是使用它。

    something = malloc(sizeof(*something));

易于记忆,如果您更改something的类型,则无需更新。

我建议弃用typedef并用显式指针表示法替换它:

typedef struct point
{
        ...
} Point;

Point* TranslateCoordinate(char* c){
    Point* newpoint;
    newpoint = malloc(sizeof(*newpoint));
    ...

如果sizeof(Point)小于sizeof(*newpoint),那么现在的代码会有未定义的行为,所以绝对会发生任何事情。

答案 1 :(得分:2)

嗯,确实有效:

#include <stdlib.h>
#include <stdio.h>

typedef struct {
    int x, y;
} *Point;

Point TranslateCoordinate(char* c){
        Point newpoint;
        newpoint=malloc(sizeof(Point));
        int row=c[0];
        int column;
        newpoint->x=row-'A';
        if(c[1]== '1' && c[2]== '0'){
            newpoint->y=9;
            return newpoint;
        }
        column=c[1];
        newpoint->y=column-'1';
        return newpoint;
}

int main (int argc, char *argv[]) {
    Point p;

    p = TranslateCoordinate("A10");
    printf("%d, %d\n", p->x, p->y);
    return 0;
}

...但仅限于sizeof(Point) == sizeof(void*) == 2 * sizeof(int) == sizeof(*newpoint)。如果这种关系不成立,任何事情都可能发生。

因此,为了避免未定义的行为,请像这样分配点:

newpoint=malloc(sizeof(*newpoint));