2010-11-06 263 views
0

我試圖在這個程序中將M和N的值設置爲任何從C程序在命令行上接收的字符串解析的值。但是,每當我運行代碼時,我都會遇到分段錯誤。我對C中的指針概念很陌生,所以我知道它就在那裏。爲什麼在這個程序中出現分段錯誤?

的代碼應該工作如下:

./a.out -1,12

打印:

1,12

感謝您的幫助!

#include <stdio.h> 
    #include <stdlib.h> 

    void getnumber(char *toTest, int *a, int *c); 

    int main (int argc, char *argv[]) 
    { 

      int a, c, curr; 

      a = 1; 
      c = 1; 
      curr = 1; 

      if (argv[1][0] == '-') 
      { 
        curr = 2; 
        getMandNValues(argv[1], &a, &c); 
      } 

      printf("%d, %d\n", a, c); 
      return 0; 
    } 


    void getMandNValues(char *src, int *a, int *c) 
    { 

      char aString[sizeof src]; 
      char bString[sizeof src]; 

      int i = 0; 

      while((aString[i] = &src[i+1]) != ',') 
        ++i; 

      aString[i] = '\0'; 

      int j = 0; 

      while((bString[j] = &src[i + 2]) != '\0') 
      { 
        ++j; 
        ++i; 
      } 

      bString[j] = '\0'; 

      *a = atoi(aString); 
      *c = atoi(bString); 
    } 

編譯器的輸出是:

/tmp/foo.c: In function ‘main’: 
/tmp/foo.c:18: warning: passing argument 2 of ‘getMandNValues’ makes pointer from integer without a cast 
/tmp/foo.c:18: warning: passing argument 3 of ‘getMandNValues’ makes pointer from integer without a cast 
/tmp/foo.c: In function ‘getMandNValues’: 
/tmp/foo.c:34: warning: assignment makes integer from pointer without a cast 
/tmp/foo.c:41: warning: assignment makes integer from pointer without a cast 
+2

我真的很希望你沒有實際縮進(或者更確切地說n ot)你所有的代碼... – 2010-11-06 16:03:53

+0

有人應該對aString和bString的長度留言。 – 2010-11-06 16:10:26

+0

aString和bString的大小在您的代碼中將始終爲4。它們不會是src字符串中傳遞的長度。 – 2010-11-06 16:13:59

回答

2
getMandNValues(argv[1], a, c); 

應該

getMandNValues(argv[1], &a, &c); 
1

你應該通過&和& C到的功能,其中之一。

3

沒有看任何事情,但你需要這次電話會議的地址。

getMandNValues(argv[1], &a, &c); 

我不知道你用的是什麼編譯器,但我也不會忽視它必須在編譯已顯示警告。 (如果您沒有使用警告你應該的最高水平。)


尋找多一些還有另一個問題

while((aString[i] = &src[i+1]) != ',') 
    ++i; 

似乎很奇怪(和錯誤的)。我這樣做:

int index=0; 
do 
{ 
    aString[index] = src[index+1]; 
    index++; 
} while (str[index] != ',') 

這裏是另一個問題

char aString[len(src)]; 
char bString[len(src)]; 
0

你混合getnumbergetMandNvalues

您提供了getnumber的原型,但沒有定義該函數。在調用此函數之前,您提供了getMandNvalues的定義,但沒有原型。

在範圍內調用沒有原型的函數是合法的。編譯器假定它返回int並且所有參數都是int。在這種情況下,這兩種情況都不是這樣。

正確的原型

0

您通過INT和INT C到一個期望的INT *和INT * C

而是採用

getMandNValues(argv[1], a, c); 

功能,嘗試

getMandNValues(argv[1], &a, &c); 
相關問題