2013-07-08 29 views
-2
int get_max_horizantal() 
{ 
    char str[2]; 
    char strb[2]; //Everything works well unless I put this 
    extern char shit[1200]; 
    int x,number; 
    while((3*x+1)<1200) 
    { 
     if(number%17==0 && number!=0) 
     { 
      x+=2; 
      number=-1; 
     } 
     str[0]=shit[3*x]; 
     str[1]=shit[3*x+1]; 
     int val1=atoi(str); 
     printf("%d\n",val1); 
     x++; 
     number++; 
    } 
} 

好了,所以這是我沒有得到在所有...全功能效果很好,但是當我把這個 字符STRB [2]; printf不打印任何東西,也沒有編譯錯誤或警告...... 這一次我真的需要幫助這一個......在此先感謝。初始化變量引起的printf停止工作

+5

請不要命名您的變量'shit' –

+0

@YuHao LOOL .... – Maroun

+0

'x'和'number'使用未初始化。 – Kninnug

回答

3

如果你想一個字符數組上使用atoi,你必須在最後把一個空終止符。 添加東西到堆棧中改變行爲通常意味着你已經走完了一些內存的末端。 使STR更大,在末尾添加空:

char str[3]; 
str[2] = 0; 
+0

非常感謝:D 需要我很長時間才能習慣C赫赫:D –

+0

謝謝,但這仍然不起作用... 仍然是一樣的 –

3

atoi想要一個合適的字符串。你傳遞它不是一個正確的字符串,因爲它不是終止的。這導致了未定義的行爲,在你的情況下,它表現爲看起來不相關的變化,使事情工作或不工作。

+0

我看...非常感謝..我想這需要很長時間才能真正學會使用C語言。感謝:D –

+0

您需要更多的時間和一些閱讀來學習C.耐心,工作和閱讀很多。 –

2

atoi(3)函數需要一個以空字符結尾的字符串,即包含零字節(通常終止該字符串)的數組char

你應該給至少3個字符str和填充它們,或者使用memset或明確澄清了最後一個字節之前,調零:

char str[3]; 
/* possible alternative: 
    memset (str, 0, sizeof(str)); // the compiler will optimize that... 
*/ 
str[0] = shit[3*x]; 
str[1] = shit[3*x+1]; 
str[2] = (char)0; 

請拍攝習慣使所有警告和調試信息在編譯時(如編譯gcc -Wall -g在Linux上),以及學習如何使用調試器gdb在Linux上)。

我敢肯定,你的編譯器能夠提醒你,xnumber沒有初始化,你應該解決這個問題:

int x=0, number=0; 

作爲一個經驗法則,提高你的源代碼,直到沒有警告由您的編譯器給出(如果使用gcc,則請求所有警告,例如-Wall,甚至可能還有-Wextra)。然後使用調試器來調試代碼:在Linux上的gdbpprintsstepddisplaybtbacktrace命令應成爲熟悉。


考慮使用snprintf(3)(但不使用過時的和不安全的sprintf)。


瞭解有關Undefined Behavior。你的程序顯然可能會發生作用(由於運氣不足),但是會出錯。

+0

謝謝,但這仍然不起作用... 仍然一樣 –

+0

什麼是行不通的? –

+0

當我初始化str2時,它仍然沒有打印任何東西 我根本就沒有得到這個 –