为什么我有exc_bad_access做演员?

时间:2015-02-15 10:29:48

标签: c exc-bad-access

我在C编程,我在将int转换为char时遇到问题。

我正在使用我的Mac与Xcode编程c。

代码是:

int main(){    
  int t = 2;    
  printf("test %s\n", (char)t); //EXC_BAD_ACCESS
  return 0;
}

我尝试了很多帖子中发现的所有内容,我真的不知道发生了什么......有什么建议吗?

2 个答案:

答案 0 :(得分:0)

请在您的问题中包含代码的目标,而不是在下面的评论中。

如果您想要输出

  

测试2

您必须将%s更改为%d

printf("test %d\n", t);

我猜你对%s有错误的想法。它不会告诉printf您希望将 int 作为字符串,它会告诉printf该参数是一个字符串!显然不是,所以你得到了例外。

如果使用%c,则告诉printf函数您要将当前ASCII表中的数字作为字符输出。例如65是'A'。

如果您有像

这样的连接情况
strcpy(str_buscar, "controlID='"); 
strcat(str_buscar, (char) t); 
strcat(str_buscar, "'");

你需要itoa而不是演员:

strcat(str_buscar, (char) t); 

您需要以下内容:

char buffer[32]; // enough space for a "number as string"
itoa(t,buffer,10);
strcat(str_buscar, buffer);

(IMHO)快捷方式是“打印”到sprintf

的缓冲区
sprintf(str_buscar,"controlID='%d'",t);

而不是打印到控制台sprintf打印到给定的缓冲区。确保您的缓冲区str_buscar足够大。

答案 1 :(得分:0)

%s格式说明符表示字符串,而不是单个字符。 Printf认为您传递的数字2是字符串的地址。它尝试访问内存地址2并失败,因为该地址不存在。

如果要打印字符,则需要%c说明符。这告诉printf打印ASCII码为2的字符.ASCII字符编号2是according to the ASCII table,是一个无法打印的控制字符,这就是为什么你会得到奇怪的输出。

如果你真的想打印字符' 2' (它有不同的代码,50),你会想要使用类似的东西:

printf("test: %c", (char)('0' + c));

此示例利用了以下事实:所有ASCII字符都有连续的代码,从48开始(' 0')。这样,如果你想打印数字0,你最终会打印出' 0' 0字符(ASCII码48 = 48 + 0)。如果您想打印数字2,您最终将打印出数字2' 2'字符(50 = 48 + 2)。

然而,这种方式有点笨拙并且在遇到大于9的数字时失败(即它仅适用于数字)。更简单的方法是不再使用角色,而是使用'%d'说明符(用于打印整数):

int t = 0;
printf("test: %d", t);