2017-06-04 28 views
1

我是一個Objective-C菜鳥,並且我想獲取一個chars數組的元素數。我設法找到只有這樣:Objective-c - 獲得一個數組的元素數

@autoreleasepool { 

    char parola[30]; 
    int c; 

    NSLog(@"Write word:"); 
    scanf("%c",&parola[30]); 

    c = sizeof(parola)/sizeof(parola[0]); 
    NSLog(@"The word has %i letters",c); 

} 
return 0; 

的問題是,它給了我,我在數組聲明中指定的長度,而不是指望元素。 有什麼想法?

+0

我想你會因爲使用'NSString'運行Objective-C而獲得更好的運氣。 – vitormm

回答

2

你有一些錯誤。

  1. 您希望用戶輸入「單詞」,即字符串。那就不要使用%c,其中僅掃描一個字符,但%s相反,它掃描一個字符串(請注意,這可能意味着該用戶還輸入空格或超過29個字符)。

  2. 您存儲在陣列之外。該陣列被聲明爲

    char parola[30]; 
    

這意味着它可以與值0。29.但是您的&parola[30]超出陣列索引(在索引30,其不「存在」)。這不是你想要的。做到這一點:

scanf("%s", parola); 

並希望用戶不超過29個字符。

字符串的長度然後可以使用

c = strlen(parola); 

發現原來這變爲:

@autoreleasepool { 
    char parola[30]; 
    unsigned long c; 

    NSLog(@"Write word:"); 
    scanf("%s", parola); 

    c = strlen(parola); 
    NSLog(@"The word has %ld letters", c); 

} 
return 0; 

相反的NSLog的,你也可以使用printf

printf("Write word: "); 

printf("The word has %ld letters\n", c); 

這看起來更清潔,爲NSLog()始終顯示這些額外的相關信息,如

2017-06-04 12:37:25.758802+0200 SOTest[4718:2690388] 

那就是,國際海事組織,難看。適用於日誌,但不適合清潔屏幕輸出。輸出現在變成:

Write word: Tesla 
The word has 5 letters 
Program ended with exit code: 0 
+0

@sulthan:對其他(已刪除)答案的評論:「在LLVM上根本不需要使用@autoreleasepool,每個線程默認都會得到一個。」是正確的,但如果從菜單中的Objective-C中啓動一個新的控制檯程序,那麼'@autoreleasepool {}'部分由Xcode生成。它還使用'NSLog()'來打印'「Hello,world!」',而不是'printf()'。 –

+0

它的工作原理!非常感謝 :) – Edo

相關問題