[英]Why is atoi giving me a segmentation fault?
我有以下代碼:
#include <stdio.h>
int main ( int argc, char *argv[] )
{
int M, N;
M = 1;
N = 1;
curr = 1;
if ( argv[1][0] == '-' )
{
curr = 2;
char *a = argv[1][1];
char *b = argv[1][3];
M = atoi(a);
N = atoi(b);
}
printf("%d\n%d", M, N);
}
因此,我通過了以下程序:
a.out -1,2
而不是獲得預期的輸出
1個
2
我遇到了細分錯誤。 是什么賦予了?
#include <stdlib.h>
,它應該很明顯。
詳細說明:您正在將整數傳遞給需要指針的函數,並且編譯器無法警告您,因為您忘記了使用原型聲明函數。 這是崩潰的原因。
而且,您只是在濫用atoi
。 atoi
解析字符串 ,而不是單個字符。 如果要將字符的值表示為數字,只需減去'0'
:
M = argv[1][1]-'0';
N = argv[1][3]-'0';
在實踐中,您還應該檢查字符是否確實是數字。
編輯:我不記得char *a = argv[1][1];
在原始帖子中(也許早期的編輯不會顯示為編輯?),但是任何明智的編譯器都應在該行上給出編譯時錯誤。 整數不會在C中隱式轉換為指針。如果編譯器確實允許這樣做,那么包含atoi
的原型將不再有幫助,因為類型錯誤較早發生。
編譯嗎?
char argv * []是char指針的數組。
char *a = argv[1][1]
將
char *
。 因此,現在您將一個char分配給char指針(應該是編譯錯誤)。
我只能假設您要說char *a = &argv[1][1]
。 順便說一句,const正確性也很好,所以const char *a = &argv[1][1]
。
順便說一句,您的代碼仍然非常不安全-您甚至都不檢查字符串的大小。 想象一下&argv[1][3]
如果您的字符串只有兩個字符, &argv[1][3]
做什么。
atoi需要一個字符串,而不是一個字符。
另外,atoi總體上也不是很好,因為它基本上沒有錯誤報告。 大多數情況下,您應該調查strtol。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.