2017-07-09 55 views
1

我想將字符串轉換爲int並從main調用該函數。第一個字符是一個聲明數字基數的字母,而字符串中的其餘字符是數字。我能夠使該功能單獨工作,但使用main函數調用它時將不會輸出正確的值。使用二進制用戶輸入的C程序調用字符串爲int函數,我無法轉換輸入

例子:

b1000 
b1010 

的結果應該是:

b 
b 
1000 
1010 

下面是代碼:

#include <stdio.h> 
#include <string.h> 
#include <math.h> 

int str_to_int(inputbase) { 
    char num1[50]; 
    num1[50] = inputbase; 

    char numcpy1[sizeof(num1) - 1]; 

    int i, len1; 
    int result1 = 0; 

    //printf("String: "); 
    //gets(num1); 

    //Access first character for base 
    printf("%c \n", num1[0]); 

    //Remove first character for number1 and number 2 
    if (strlen(num1) > 0) { 
     strcpy(numcpy1, &(num1[1])); 
    } else { 
     strcpy(numcpy1, num1); 
    } 
    len1 = strlen(numcpy1); 

    //Turn remaining string characters into an int 
    for (i = 0; i < len1; i++) { 
     result1 = result1 * 10 + (numcpy1[i] - '0'); 
    } 

    printf("%d \n", result1); 
    return result1; 
} 

int main() { 
    char *number1[50], *number2[50]; 
    int one, two; 

    printf("\nAsk numbers: \n"); 

    gets(number1); 
    gets(number2); 

    one = str_to_int(number1); 
    two = str_to_int(number2); 

    printf("\nVerifying...\n"); 
    printf("%d\n", one); 
    printf("%d\n", two); 

    return 0; 
} 
+1

請問'INT str_to_int(inputbase)'編譯您機?你使用什麼編譯器? – chux

+0

這看起來非常像我的作業問題。 – ndim

+0

我正在使用gcc編譯器。函數int str_to_int(inputbase)不會編譯 – vibeon7

回答

1

我想你的代碼不能因爲一些編譯錯誤。

第一個是在inputbase而沒有類型定義的線

int str_to_int(inputbase) 

如果改爲

int str_to_int(char * inputbase) 

下一個點改進是符合

num1[50] = inputbase; 

一樣,沒有設置錯誤的assignement:

  1. num1[50]意味着獲得第51屆項目,但從0到49索引的只有50個項目
  2. 聲明num1[0] = inputbase;(以及任何其他正確的指數)是錯誤的,因爲在類型區別:num1[0]char,但inputbase是指針
  3. num1 = inputbase;也將是錯誤的(字符串=不能在C中使用的複製,所以考慮使循環或使用標準庫函數strncpy

而且,由於這只是問題的開始,我建議從十進制輸入使用一些標準功能轉換char*字符串int開始(如atoi,或sscanf),再經過你檢查程序,並找到它,如果它正確的,需要你能避免使用標準轉換,寫自己的str_to_int

+0

不主張使用'strncpy()',它永遠不是正確的工具,特別是對於初學者。也不鼓勵使用'gets()'。 – chqrlie

0

原型爲你的函數str_to_int()應指定intputbase類型。您正在傳遞一個字符串,並且str_to_int沒有理由修改此字符串,因此該類型應爲const char *inputbase

此外,你不需要爲字符串的本地副本,只需訪問的第一個字符相應地確定基和解析其餘數字:

#include <stdlib.h> 

int str_to_int(const char *inputbase) { 
    const char *p = inputbase; 
    int base = 10; // default to decimal 

    if (*p == 'b') { // binary 
     p++; 
     base = 2; 
    } else 
    if (*p == 'o') { // octal 
     p++; 
     base = 8; 
    } else 
    if (*p == 'h') { // hexadecimal 
     p++; 
     base = 16; 
    } 
    return strtol(p, NULL, base); 
}