0

尝试将 NSString 转换为大写时,出现线程断点错误。我希望将问题的输入设置为大写字母,以便用户可以输入 no、No、nO,并且仍然可以在内部将其转换为 NO。我知道我可以让它要求 0 或 1,但这样做对用户来说更加友好。我打开了调试模式,这将提供一些额外的数据以使其更简单。我在 [string uppercaseString] 行获得了线程断点。对于输出,我第一次收到预期的调试器消息,但程序在显示第二个之前停止。

    #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
4

2 回答 2

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] ...
于 2013-07-24T20:32:21.287 回答
0

您的fgets/getchar不会做您期望的事情 -fgets将在用户输入后读取换行符,除非该输入超过 19 个字符,然后getchar将读取输入,直到找到第二个换行符。而是尝试:

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

fscanf不会消耗换行符 - 有关详细信息请参阅文档。

除此之外,您的代码在单独放置在函数中时可以工作,因此如果有任何东西阻止它工作,那么它来自您的代码所在的上下文。

高温高压

于 2013-07-24T22:09:18.433 回答