Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C IF语句未能检查正确的值_C_If Statement - Fatal编程技术网

C IF语句未能检查正确的值

C IF语句未能检查正确的值,c,if-statement,C,If Statement,我有一个函数,可以将字符串坐标转换为0-9之间的整数。 现在,函数似乎无法获取字符串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;

我有一个函数,可以将字符串坐标转换为0-9之间的整数。 现在,函数似乎无法获取字符串
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函数的调用;它从文件中获取一个字符串,并将其分配给名为subside的结构

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;

嗯,它确实起作用了:

#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;
}

嗯,它确实起作用了:

#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;
}
这不可能是正确的

似乎被定义为指向某个结构的指针。这本身就是一种糟糕的风格,会给你带来麻烦。如果您想保持这种状态,最简单的正确调用顺序是

    newpoint = malloc(sizeof(*newpoint));
在我看来,即使没有指针typedef,它也是一种很好的全面风格,因此我建议始终使用它

    something = malloc(sizeof(*something));
易于记忆,如果您更改了
某物的类型
,则无需更新

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

typedef struct point
{
        ...
} Point;

Point* TranslateCoordinate(char* c){
    Point* newpoint;
    newpoint = malloc(sizeof(*newpoint));
    ...
如果
sizeof(Point)
小于
sizeof(*newpoint)
,则当前的代码具有未定义的行为,因此任何事情都可能发生

这不可能是正确的

似乎被定义为指向某个结构的指针。这本身就是一种糟糕的风格,会给你带来麻烦。如果您想保持这种状态,最简单的正确调用顺序是

    newpoint = malloc(sizeof(*newpoint));
在我看来,即使没有指针typedef,它也是一种很好的全面风格,因此我建议始终使用它

    something = malloc(sizeof(*something));
易于记忆,如果您更改了
某物的类型
,则无需更新

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

typedef struct point
{
        ...
} Point;

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

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

newpoint=malloc(sizeof(Point))有效?A10应该给你什么,它实际上给了你什么?进一步您是如何检查的?
'A'-'A'=0
。你期望什么?你从你的函数中得到了什么?为什么错了?您还需要包括您对
点的定义
@omergutman我们中的一些人一直在关注这个问题。你从这个函数中得到了什么?如何定义Point?Point是ADT,因为您可以直接在函数中访问其成员
x
y
,它更像是该函数中的一种具体数据类型。在外部,它仍然可以是一种抽象数据类型,但通常需要某种抽象障碍才能将其称为ADT。在C语言中添加这个抽象障碍可能值得,也可能不值得(其他语言有自己的抽象代价)。将这些简单的数据类型具体化并按值传递通常是一种合理的策略有效?A10应该给你什么,它实际上给了你什么?进一步您是如何检查的?
'A'-'A'=0
。你期望什么?你从你的函数中得到了什么?为什么错了?您还需要包括您对
点的定义
@omergutman我们中的一些人一直在关注这个问题。你从这个函数中得到了什么?如何定义Point?Point是ADT,因为您可以直接在函数中访问其成员
x
y
,它更像是该函数中的一种具体数据类型。在外部,它仍然可以是一种抽象数据类型,但通常需要某种抽象障碍才能将其称为ADT。在C语言中添加这个抽象障碍可能值得,也可能不值得(其他语言有自己的抽象代价)。将这些简单的数据类型具体化并按值传递通常是一种合理的策略。如果如您所假设的那样,
Point
被定义为指向该结构的指针,那么
sizeof(void*)
sizeof(int)
有什么相关性?(不是向下投票者)@下划线\u d
sizeof(Point)
分配未添加结构中两个ints所需的确切内存量。右,作为指向未命名的指针的
struct
确实在扭曲我对现实的把握。如果,如您所假设的那样,
Point
被键入为指向该结构的指针,那么
sizeof(void*)
sizeof(int)
有什么相关性呢?(不是向下投票者)@underline_d
sizeof(Point)
在一个未添加的结构中分配两个整数所需的确切内存量。对,
typedef
作为指向未命名结构的指针,这确实影响了我对现实的理解。我看不到这段代码有任何其他问题,可能是因为没有。如果仍然失败,请发布一个。但是我想使用一个abtract数据类型,有没有其他方法可以做到?另外,更改为
newpoint=malloc(sizeof(Point))
newpoint=malloc(sizeof(*newpoint))没有任何明显的差异(数字仍然错误“@OmerGuttman”想要使用抽象数据类型“您仍然可以。它有什么问题吗?”数字仍然错误"然后你需要发布一个。如果不能够看到和/或复制它,就很难找到问题。这是你的代码,添加了最少的内容。它似乎工作正常。是否有错误的数字?我看不到此代码有任何其他问题,可能是因为没有。如果仍然失败,请发布一个。但我想使用一个跟踪数据键入,是否有其他方法可以执行此操作?以及从更改为
newpoint=malloc(sizeof(Point));
newpoint=malloc(sizeo