为啥我在字符串变量上得到“程序接收信号:”EXC_BAD_ACCESS“

Posted

技术标签:

【中文标题】为啥我在字符串变量上得到“程序接收信号:”EXC_BAD_ACCESS“【英文标题】:Why do i get "program received signal: "EXC_BAD_ACCESS" on NSString veriable为什么我在字符串变量上得到“程序接收信号:”EXC_BAD_ACCESS“ 【发布时间】:2012-10-16 10:06:49 【问题描述】:

我最近刚开始学习Objective C,当我运行下一个程序时出现错误 "程序接收信号:"EXC_BAD_ACCESS" 对于代码行

 if([*userChoice isEqualToString:@"yes"])

完整代码为:

void initGame (void);
void restartGame(void);
void toGoOn(char *playerChoice);


int guess=-1;
int from=-1;
int to=-1;
bool playStatus=true;
bool gameStatus=true;
int answer=-1;
NSString *userChoice[10];

//if true the game is on

int main (int argc, const char * argv[])


    @autoreleasepool 

        GuessManager *game=GUESS;  
        NSLog(@"Hello, lets play");
        NSLog(@"Please provide a positive range in which you would like to play");
      do
          initGame();
          [game setnumberToGuess:from :to];
        do                        
            printf("Make you guess:");
            scanf("%d", &guess);
            [game setUserGuess:guess];
            [game checkUserGuess];
            if([game getDidIgetIt])
            
                playStatus=false;               
             
            else
            
                playStatus=true;
            

         while (playStatus);
         restartGame();
      while(gameStatus);  
        printf("Thanks For Playing PanGogi Games! GoodBye");
    
    return 0;






void initGame (void)

    printf("from:");
    scanf("%d",&from);
    printf("to:");
    scanf("%d",&to);    


void restartGame(void)

    printf("Would you like to continue?(yes/no)");
    scanf("%s",&userChoice); 
    //scanf("%d",&answer); 

   // if(answer==1)
    if([*userChoice isEqualToString:@"yes"])
    
        gameStatus=true;
    
    else
    
        gameStatus=false;
    

我了解它与 NSString 变量 userChoice 及其在 如果,但我找不到是我做错了什么。

请帮忙:)

【问题讨论】:

if([userChoice isEqualToString:@"yes"]) 你在使用NSString,就好像它是char 尝试 userChoice 而不是 *userChoice 仅仅删除* 是不够的。将scanfNSString 一起使用也是错误的。为什么要声明NSStrings 的C 数组? 【参考方案1】:

代码中有 3 个错误

1) 我认为您对 NSString 和 C 风格的字符数组感到困惑...您只需要使用单个 NSString 对象来保存多字符数据..

NSString *userChoice;   

2) 既然要使用scanf输入数据,就需要一个C风格的字符数组。 scanf 不适用于 NSString 类型。

char tempArray[10];
int count = scanf("%s",&tempArray);
userChoice  = [NSString stringWithBytes:tempArray length:count encoding: NSUTF8StringEncoding];

3) 现在你可以直接使用 NSString.. 不需要像语法这样的指针

if( [userChoice isEqualToString: @"yes"])
   .....
   .....

【讨论】:

我不能只比较两个字符。我的意思是将 userChoise 保留为 char 并在 scanf 中仅接收一个字符 (y/n) 并将其与 char y 或 n 进行比较。如何正确比较两个字符? 您可以只使用 C 字符变量,使用 scanf%c.. 输入,然后像在 C 中一样进行比较,即 if(c == 'y').. 好的,我将 dikleration 更改为 char *userChoice;和比较:if(userChoice=="y") 当我运行它时它没有得到 y 等于 y。并且在我收到通知“字符串文字未指定”【参考方案2】:

您正在使用NSString,就好像它是char。它不是。这是一个代表字符串的类。

scanf 函数是 C 函数,需要一个 char 数组,而不是 NSString

char str[80];
scanf("%s", &str);

您可以像这样使用char 数组初始化NSString 对象:

NSString *userChoice = [NSString stringWithCString:str encoding:NSASCIIEncoding];

然后像这样比较:

if ([userChoice isEqualToString:@"yes"]) 
   ...
 else 
   ...

【讨论】:

以上是关于为啥我在字符串变量上得到“程序接收信号:”EXC_BAD_ACCESS“的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在使用 GCD 时收到错误 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

为啥我在这个非常简单的 MySQL 查询上得到文件排序?

为啥我在 IOS 上得到 Mapboxgl api 的空白页面?

为啥我在使用 Nginx 和 Gunicorn 的 Django 应用程序上得到 502 Bad Gateway?

为啥我在一个 webpack 项目上得到“意外的令牌导入”,而在另一个项目上却没有?

为啥我在比较我的优先级队列堆中的两个索引的行上得到空值?