2013-04-05 45 views
1

我有一個如下所示的代碼,最後一條語句只有在我使用l_plates [i]時纔有效。在下面的情況下,它會拋出一個錯誤「傳遞'sprintf'的參數1使得整型指針沒有投射」 如果我還需要另一個for循環,那麼該怎麼辦?如果我使用sprintf,我應該使用額外的元素嗎?請解釋一下 。提前致謝。爲什麼我們不應該在sprintf中包含最後一個數組元素?

char type, letters[4], digits[5]; 
char l_plates[M][N]; 

for (i=0; i<M; i++) { 
    scanf(" %c", &type); 
    scanf("%3s", letters); 
    scanf("%4s", digits); 
    sprintf(l_plates[i][N], "%s %s %c", letters, digits, type); 
} 
+0

'l_plates [i] [N]'的類型是char,但是'sprintf()'想在第一個參數中使用'char *'。此外,讀取'l_plates [i] [N]'正在讀取超出數組邊界。 – jxh 2013-04-05 01:34:30

+0

使用'&l_plates [i] [0]'。如果你使用'N',你就在緩衝區的末尾。 – 2013-04-05 01:34:58

+0

sprintf需要一個指向需要寫輸出的內存的指針。你傳遞的是二維字符數組中第(N + 1)個元素到sprintf。不是第i個緩衝區。要修復你的代碼,使用'sprintf(l_plates [i],....);'。 – 2013-04-05 01:37:09

回答

3

我在這裏看到兩個問題。首先,sprintf的第一個參數應該是char*,而不是char,這是您發送給它的內容。其次,大小爲N的數組從0N - 1索引。通過嘗試訪問元素N,您正在走出陣列。最後一個元素是[N - 1]

+0

+1澄清數組的邊界 – 2013-04-05 01:37:32

0

在你sprintf線,表達l_plates[i][N]指的是單個字符,而你試圖寫它整個字符串。

變量l_plates是長度爲N(或二維字符數組)的一維字符串數組。

如果您需要字符串的二維數組,那麼你需要的是這樣定義l_plates

char* l_plates[M][N]; 

然後的malloc這些字符串相應。

+1

感謝您的回覆。「變量l_plates是長度爲N的字符串的一維數組」,那麼「我」是什麼?它是一個長度爲i或N.so的單維數組,如果我想要2個循環,我應該聲明另一個數組元素,如l_plates [i] [N] [P]? – user2247287 2013-04-05 04:55:12

0

讓我們來看看l_plates聲明:

焦炭l_plates [M] [N];

這就是說,l_platesM字符的數組N數組。另一種考慮這種方式的方式是作爲一個二維字符數組。

那麼l_plates[i][N]是什麼類型?這是一個char!換句話說,它是一個單一的符號。但是,sprintf()需要char*作爲其第一個參數。這就是爲什麼你用上面的代碼得到編譯器錯誤。另一方面是陣列char s。 C和C++都可以將這個數組轉換爲char*,所以編譯器不會抱怨。

0

這是因爲l_plates[i]是一個字符串,而l_plates[i][N]是一個單字符,雖然是一個超出界限的字符(因爲N-1是最後一個字符)。

這就是說,你可能與snprintf()更好:

snprintf(l_plates[i], N, "%s %s %c", letters, digits, type); 

這可以確保你不會溢出你的字符數組。

0

您應該查看指針和數組在C中的工作方式。

l_plates[i][N]實際上是指char,所以它甚至不會編譯; sprintf預計char*將寫入輸出。 l_plates[i]的類型爲char[N],可以隱式轉換爲char*,指向內部數組的開始。把它作爲sprintf的參數使它做你想要的。

順便說一句,與l_plates[i][N]你正在訪問非法偏移量的內部數組。大小爲N的數組的偏移量應該在0到N-1之間。 C/C++在運行時不一定會抱怨,但它幾乎總是一個錯誤。在這種情況下,l_plates[M-1][N]的確指向分配給l_plates的內存。

相關問題