为什么我有 exc_bad_access 演员?

why i have exc_bad_access doing cast?

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

我正在使用我的 mac 和 Xcode 来编程 c.

密码是:

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

我尝试了很多 post 中找到的所有方法,我真的不知道发生了什么...有什么建议吗?

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

如果你想要输出

test 2

您必须将 %s 更改为 %d

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

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

如果你使用 %c,你告诉 printf 函数你想将你的数字输出为当前 ASCII table 中的字符。例如 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);

一个(恕我直言)快捷方式是 "print" 到具有 sprintf

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

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

%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”字符(ASCII 代码 48 = 48 + 0)。如果你想打印数字 2,你最终会打印“2”字符 (50 = 48 + 2)。

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

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