2013-07-09 104 views
0

我需要一個scanf結果並將它變成一個NSString,然後將NSString轉換爲Pea類的實例pea1的一個屬性。 如果我可以在scanf上加上某種限制,這也會很好,所以用戶不會放太多字符並停止程序,但這不是絕對必要的。如何將scanf結果轉換爲NSString,然後轉換爲類的屬性?

我花了我所有的空閒時間(六個小時)試圖通過互聯網找到這個,但它不工作。將scanf轉換爲NSString或NSString成爲類實例的屬性有很多結果,但是我找不到它們並將它們組合起來不起作用。

我需要這個,以便用戶可以通過scanf命名豌豆,然後讓豌豆的名字被顯示出來。

這裏是我的代碼,一切並不影響取出這個問題:

#import <Foundation/Foundation.h> 

    @interface Pea: NSObject 

    @property (retain) NSString *name; 

    @end 

    @implementation Pea 

    @synthesize name; 

    @end 

    int main (int agrc, char * argv[]) 

    { 
     @autoreleasepool { 
      Pea *pea1 = [[Pea alloc] init]; 

      char word; 

      //Asks for name of Pea 
      NSLog(@"What would you like to name this pea?"); 
      scanf("%s", &word); 

      NSString* userInput = [[NSString alloc] initWithUTF8String: &word]; 
      [pea1 setName: userInput]; 

      //NSLogs data 
      NSLog (@"Your pea plant, %@\n.", [pea1 name]); 

     } 
     return 0; 
    } 

謝謝你這麼多,你可能有任何幫助! :D

回答

2

首先你要存儲一個字符中的字符串的,這是錯誤的,因爲用戶可能超過一個字符類型的字符串長,所以你必須要起訴一個數組:

size_t size= 100; // Arbitrary number 
char word[size]; 

然後,我建議使用與fgets而不是scanf函數,所以你可以限制輸入所採取的字符數:

fgets(word,size,stdin); 

與fgets還追加終止字符,但它不會刪除「\ n」字符,所以如果你不想要它,你必須將其刪除:

size_t length= strlen(word); 
if(word[length-1] == '\n') // In case that the input string has 99 characters plus '\n' 
    word[length-1]= '\0'; // plus '\0', the '\n' isn't added and the if condition is false 

最後創建Objective-C的字符串:

NSString* value= [NSString stringWithUTF8String: word]; 
pea1.name= value; 
+0

謝謝,這幫了我很多;另外,對於任何有這個問題的人,我在執行時遇到了一個錯誤,導致程序停止運行(線程斷點是fgets行)。但是,不是'size_t size = 100; char word [size];'我用了'char [100];'這個工作。此外,請執行'fgets(word,100,stdin)'而不是fgets line @Ramy建議。但非常感謝你! –

+0

'scanf'也可以限制字符的數量,例如, 'scanf(「%99s」,&word);' – newacct

+0

'我不喜歡它,因爲它可能會使標準輸入緩衝區變髒 –

0

char是一個符號,也許你的意思是char *word

你的問題是 - 你掃描1個符號,然後你像使用字符串一樣使用它。