2017-06-23 61 views
-1

我想然而更新的字符數組傳遞迴原來的main()功能,當我嘗試它,它給了我之前的指針在陣列上覆制「字符」不同()[15]'傳遞更新的字符數組回通過指針

這是一個ISBN驗證程序。

這就是:

int main(void) 
{ 
    int divisible; 
    char choice, trash; 
    char code[15]; 


    do 
    { 
     printf("Enter an ISBN (book) number:\n"); 
     fgets(code, 15, stdin); 

     printf("The ISBN entered is:%s\n", code); 
     divisible = testISBN(&code); 
     if (divisible == 1) 
      printf("\n\n\tValid ISBN Number\n"); 
     else 
      printf("\n\n\tInvalid ISBN Number\n"); 

     printf("\nDo you wish to continue? (Y/N)\n"); 
     choice = getchar(); 
     trash = getchar(); 
    } while (toupper(choice) != 'N'); 

    return 0; 
} 


int testISBN(char *code) 
{ 
    int i; 
    int sum = 0; 
    int weight = 10; 
    char codefinal[10]; 
    int x = 0; 
    for (i = 0; i<15; i++) 
    { 
     int chVal; 
     if ((i == 9) && (toupper(code[i]) == 'X')) 
     { 
      printf("%c",code[i]); 
      chVal = 10; 
     } 
     else 
     { 
      chVal = code[i] - '0'; 
     } 
     if (chVal == 0 || chVal == 1 || chVal == 2 || chVal == 3 || chVal == 4 || chVal == 5 || chVal == 6 || chVal == 7 || chVal == 8 || chVal == 9) { 
      char y = (char)chVal; 
      codefinal[x] = y; 
      x++; 
     } 

     sum += chVal * weight; 
     weight--; 
    } 
    printf("sum is %d", sum); 

    for (i = 0; i < 15; i++) { 
     *code[i] = codefinal[i]; 
     printf("%c", code); 
    } 
    return (sum % 11) == 0; 
} 

在最底層,其中i表示*code[i] = codefinal[i]是從哪裏獲得的問題。我只是想通過指向我的新的更新數組數組傳回給我的主。

+0

codefinal [14]不存在。它的大小爲10,你的i爲14. – Chris

+0

這個'divisible = testISBN(&code);'也是錯誤的,'code'是一個數組,所以它會自動衰減爲函數調用的第一個元素的指針。 '&'。 - 你的編譯器應該警告你關於不匹配的指針類型 –

+0

這個語法是錯誤的:'* code [i] = codefinal [i];' –

回答

0

完成下列步驟在您的代碼更改:printf("%c", code);你是印刷

  • 的功能int testISBN(char* code)變化原型int testISBN(char code[])
  • 變化從testISBN(&code);testISBN(code);
  • 行更改*code[i] = codefinal[i];打電話來code[i] = codefinal[i];
  • 在行不是價值而是地址code[]。所以將它改爲printf("%c", code[i]);注意code[]也包含一些不可打印的字符。
  • 意見建議:爲簡單起見,您可以將if (chVal == 0 || chVal == 1 || chVal == 2 || chVal == 3 || chVal == 4 || chVal == 5 || chVal == 6 || chVal == 7 || chVal == 8 || chVal == 9)更改爲if((chVal >= 0) && (chVal <= 9))
+0

所以有一個問題,它不存儲爲'價值'?我根本無法打印。 – andirewftw

+0

它存儲在codefinal不正確,它應該說'0'而不是空值: http://puu.sh/ws64q/42fc4d9c05.png – andirewftw

+0

您正在打印的不是值,而是代碼[]的地址' 。我已經更新了相同的答案。 – cse

0

只需傳遞代碼,就像它會衰減到指針一樣。

char code[15]; 
divisible = testISBN(code); 

您可能希望testISBN簽名更改爲

int testISBN(char code[15]); 

這樣,你有更高的機會獲得編譯器警告,如果你陷入困境指數。

簡單的例子:

#include <stdio.h> 

void func(char arr[3]) { 
arr[0] = 'H'; 
arr[1] = 'i'; 
arr[2] = 0; 
} 

int main() { 
    char arr[3] = {0}; 
    func(arr); 
    printf("%s", arr); 
} 

打印 「嗨」


正如評論者提到了你的代碼有其他問題,如內存越界訪問。爲了讓你的生活在編譯器的手冊上花費一些時間,並學習如何打開所有警告,他們大多數時間都會指出代碼問題。