2015-08-26 185 views
0

我剛接觸c並嘗試編寫一個控制檯應用程序,它從用戶的音樂項目中獲取拍號和BPM信息,並返回一個欄的長度秒。從一個字符串中取一個字符並將其轉換爲int c

我想用時間簽名的用戶輸入字符串(例如:「4/4」),隔離第一個字符(代表每個節拍數的數字),並將其轉換爲要使用的整數在計算中。

這兩種方法我嘗試

int beatsPerBar = timeSignature[0]; 

int beatsPerBar = atoi(timeSignature[0]) 

都返回相同的錯誤:「下標值既不是數組也不指針也不載體」。

如何正確更改此字符的變量類型?

編輯:

使用@ R-Sahu的建議。下面的代碼編譯並構建,沒有錯誤或警告。

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

int main() 
{ 

    char timeSignature[4]; 
    int BPM; 

    printf("Enter the working time signature of your project:"); 
    scanf("%s",&timeSignature[4]); 

    int beatsPerBar = timeSignature[0]-'1'; 

    printf("Enter the beats per minute:"); 
    scanf("%i",&BPM); 

    printf("%i\n", beatsPerBar); 

    return 0; 

} 

然而,當我測試的代碼與下面的值

timeSignature = "4/4" 
    BPM = 180 

我得到一個導致-47的整數(計算器檢查說,它應該返回45)。

我在做什麼錯?顯然,我對編碼和用於表示字符值的整數的理解並不是它應該的地方。任何人都可以分享有關此主題的廣泛教程的鏈接?

+0

他們「返回錯誤...」?不太可能。你的意思是你得到一個編譯器錯誤/警告。請提供[mcve]。 – Olaf

+0

哦,你不能改變變量的類型(即使是動態類型的語言也不行)。 – Olaf

+0

不要忘記像10/8這樣時髦的時間簽名。 – Bathsheba

回答

2

使用

int beatsPerBar = atoi(timeSignature[0]) 

應導致編譯器錯誤。 atoi的輸入參數類型爲char const*,其中timeSignature[0]不是。

int beatsPerBar = timeSignature[0]; 

在語法上是正確的,但不是語義上的。這會將beatsPerBar的值設置爲用於表示字符4的整數值。如果您的平臺使用ASCII編碼,則該值爲52

你應該使用:

​​

獲得分配給beatsPerBar4

如果你想要更加小心,你應該,你可以添加以下檢查。

int beatsPerBar = 0; 
if (isdigit(timeSignature[0])) 
{ 
    beatsPerBar = timeSignature[0] - '0'; 
} 
else 
{ 
    // Deal with error. 
} 
+0

@NathanielLindsey,你有問題嗎?順便說一句,'timeSignature [0] - '1''會給你錯誤的結果。 –

+0

請參閱對原始問題的編輯。我無法壓縮以適應評論。 –

+0

@NathanielLindsey,'scanf(「%s」,&timeSignature [4]);'不對。它將'timeSignagure'的最後一個元素的地址傳遞給'scanf'。您最終訪問數組越界。使用'scanf(「%s」,&timeSignature [0]);',或者簡單地'scanf(「%s」,timeSignature);' –

0

正如@ R-薩胡表示:

The input argument type of atoi is const char *

所以,如果你仍然想使用的atoi您可以將字符轉換爲字符串,然後使用的atoi(例如)如下:

if (isdigit(timeSignature[0])) 
    char dig[2]= {timeSignature[0],'\0'}; 
    int beatsPerBar = atoi(dig); 
0

無需使用atoi,您可以簡單地將char轉換爲int。例如

​​
相關問題