2017-05-28 103 views
0

我有翻譯字符串從0-9座標爲int數的函數。 現在的功能似乎輪不到字符串A10(例如),並將其轉化爲0,9。也許有人可以告訴我爲什麼?IF語句無法檢查正確的值

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

我應該注意的是,字符串範圍從110AJ值。 這也是從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; 
+3

是'newpoint =的malloc(的sizeof(點));'有效? A10應該給你什麼,它給你帶來了什麼?還有,你如何檢查? – matt

+0

@matt A10可以給出x值爲0,y值爲9我使用一個打印點'printf(「%d%d \ n」,p-> x,p-> y)的函數來檢查它。 ' –

+0

你可以拋棄malloc線嗎?那麼告訴我們,當你通過'A10'時你實際得到了什麼? – matt

回答

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

...但ONL y當sizeof(Point) == sizeof(void*) == 2 * sizeof(int) == sizeof(*newpoint)。如果這種關係不成立,任何事情都可能發生。

因此,爲了避免不確定的行爲,分配點是這樣的:

newpoint=malloc(sizeof(*newpoint)); 
+0

如果,你假設,'Point'被typedefd作爲一個指針結構,也'的sizeof(void *的)'或'的sizeof(int)的'有那麼有什麼關聯? (而不是downvoter) –

+0

@underscore_d'sizeof(Point)'分配兩個inpad結構中所需的精確內存量。 – hidefromkgb

+0

對,'typedef'作爲指向未命名的''結構'是真的與我對現實的把握擰緊。 –

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

這不可能是正確的。

Point似乎可以通過typedef是一個指向某個結構。這本身就是不好的風格,會給你帶來問題。如果你想保持這種無論如何,最簡單的正確調用序列將

newpoint = malloc(sizeof(*newpoint)); 

這也是在我看來,即使沒有指針的typedef一個良好的全方位的風格,所以我會建議一直使用它。

something = malloc(sizeof(*something)); 

易記,並不需要,如果你改變的something類型進行更新。

我會建議進取心的類型定義,並有明確的指針符號代替它:

typedef struct point 
{ 
     ... 
} Point; 

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

的代碼,因爲它代表目前已未定義行爲,如果sizeof(Point)是小於sizeof(*newpoint),所以絕對什麼都可能發生。

+0

我看不到這個代碼的任何其他問題,也許是因爲沒有。如果仍然失敗,請發佈[mcve]。 –

+0

但我想使用abtract數據類型,有沒有其他辦法可以做到這一點? 也爲'newpoint =的malloc(的sizeof(點))的變化;''newpoint =的malloc(的sizeof(* newpoint));'didnt作出任何明顯的diffrence(數字仍然錯了 「 –

+1

@OmerGuttman」 要使用一個抽象的數據類型「你仍然可以,是否有一些問題?」這些數字仍然是錯誤的「然後你需要發佈一個[mcve],如果不能看到和/或發現問題就很難複製它。 –