我有一个函数将字符串坐标转换为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;
}
我应该注意,字符串的值范围从1
到10
以及从A
到J
。
这也是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;
答案 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));