为什么我有 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);
我正在用 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);