2013-07-24 19 views
0

嘗試將NSString轉換爲大寫時,出現線程斷點錯誤。 我想將問題的輸入設置爲大寫字母,以便用戶可以鍵入no,no,nO,並且仍然會將其內部轉換爲NO。 我知道我可以讓它只需要一個0或1,但它更方便用戶這樣做。 我有調試模式,這將提供一些額外的數據,使這更簡單。 我在[string uppercaseString]行獲取線程斷點。 對於輸出,我第一次得到預期的調試器消息,但程序在顯示第二個消息之前停止。將NSString轉換爲大寫線程斷點

#define DEBUG 1 
    NSLog(@"Do you have an account already? YES or NO."); 
    char yesOrNo [20]; 
    fgets (yesOrNo, sizeof yesOrNo, stdin); 
    int c; 
    while ((c = getchar()) != '\n' && c != EOF); 
    if (yesOrNo [strlen(yesOrNo) - 1] == '\n') { //In case the input string has # characters plus \n 
     yesOrNo[strlen(yesOrNo) - 1] = '\0';} //Plus '\0', the '\n' isn't added and the if condition is false 
    NSString *string = [NSString stringWithUTF8String:yesOrNo]; 
    #ifdef DEBUG 
    NSLog(@"DEBBUGER MESSAGE: string == %@", string); 
    #endif 
    NSString *stringUppercase = [string uppercaseString]; 
    #ifdef DEBUG 
    NSLog(@"DEBBUGER MESSAGE: stringUppercase == %@", stringUppercase); 
    #endif 
+0

爲什麼areyou使用'與fgets '*和*'getchar'? –

+0

fgets用於用戶輸入,getchar是每次使用後刷新標準輸入的行的一部分。我從c-faq.com那裏得到了這個信息,對於像我這樣以前曾經在刷新標準輸入時遇到問題的人,我一次又一次地共享了這個信息。 –

回答

0

fgets/getchar不會做你所期望的 - 在fgets將讀取用戶輸入之後的換行符,除非輸入超過19個字符,然後將getchar讀取輸入,直到找到第二個換行符。相反,嘗試:

if (fscanf(stdin, "%3s", yesOrNo) == 1) 
{ 
    // process input 
} 

fscanf消耗換行符 - 詳見文檔。

除此之外,通過將自身置於一個功能的時候,所以如果有什麼是從工作停止它,它是從你的代碼是在上下文降臨到你的代碼工作。

HTH

0

sizeof可能不工作的方式,你覺得它在這一點你的程序:

if (yesOrNo [sizeof (yesOrNo) - 1] == '\n') { //In case the input string has # characters plus \n 
    yesOrNo[sizeof (yesOrNo) - 1] = '\0';} //Plus '\0', the '\n' isn't added and the if condition is false 

這將會給你yesOrNo數組的大小,這是20,不字符串的長度。使用strlen(3)代替:

if (yesOrNo[strlen(yesOrNo) - 1] ... 
+0

那麼[strlen(3)(是或否)...? –

+0

...不,「strlen(yesOrNo)'。 '3'是手冊頁部分。你讀過鏈接了嗎? –

+0

沒有意識到你鏈接到的東西,對不起。我試過了,它沒有任何錯誤,它會解決'\ n'的任何問題,所以謝謝。但是,我不能接受你的答案,因爲它沒有回答主要問題。 :/原來的帖子發生了變化。 –