将NSString转换为大写的线程断点

时间:2013-07-24 20:26:25

标签: objective-c nsstring runtime-error uppercase

尝试将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

2 个答案:

答案 0 :(得分: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] ...

答案 1 :(得分:0)

您的fgets / getchar将无法达到预期效果 - fgets将在用户输入后读取换行符,除非输入超过19个字符,然后{ {1}}将读取输入,直到找到第二个换行符。而是尝试:

getchar

if ( fscanf(stdin, "%3s", yesOrNo) == 1 ) { // process input } 使用换行符 - 有关详细信息,请参阅文档。

除了你的代码本身放在一个函数中时,你的代码是有效的,所以如果有什么东西阻止它工作,它将来自你的代码所在的上下文。

HTH