这个基本的C程序总是得到错误的答案,尤其是x总是0,y的值是正确的 #包括 int main(){ 字符x,y; scanf(“%d%d”,&x,&y); printf(“%d%d”,x,y); }
例如: 我输入“3 4”这个基本的C程序总是得到错误的答案,尤其是x总是0,y的值是正确的 #包括 int main(){ 字符x,y; scanf(“%d%d”,&x,&y); printf(“%d%d”,x,y); },c,C,例如: 我输入“3 4” 当scanf中的格式说明符为%d时,它将输出“0 4”,预期参数的类型为int*。当预期类型为int*时,您正在传递类型为char*的参数。这会导致未定义的行为。如果您希望用户键入两个小整数并显示它们,请将char更改为int,使您的代码如下图所示: #include <stdio.h> int main() { char x, y; scanf("%d %d", &x, &y); printf("%d %d", x
当
scanf
中的格式说明符为%d
时,它将输出“0 4”,预期参数的类型为int*
。当预期类型为int*
时,您正在传递类型为char*
的参数。这会导致未定义的行为。如果您希望用户键入两个小整数并显示它们,请将char更改为int,使您的代码如下图所示:
#include <stdio.h>
int main() {
char x, y;
scanf("%d %d", &x, &y);
printf("%d %d", x, y);
}
#包括
int main(){
int x,y;
scanf(“%d%d”,&x,&y);
printf(“%d%d”,x,y);
}
替换int x,y代码>带有长x,y代码>如果您希望使用大于几位数的数字
但是,此程序不能很好地处理带小数的字符串或数字。对象的类型和转换说明符必须匹配,或者行为未定义。下面是转换说明符及其预期类型的简短列表:
#include <stdio.h>
int main() {
int x, y;
scanf("%d %d", &x, &y);
printf("%d %d", x, y);
}
希望你能注意到这种模式。此列表仅包括有符号和无符号十进制整数;有关转换说明符及其所需类型的完整列表,请参阅的7.21.6.2或查看手持式C参考手册。char x,y代码>-->intx,y代码>。打开编译器警告。这应该是int而不是char,但即使这是故意的,我也不知道您使用的是什么平台和编译器,但我使用code::blocks和linux内置的gcc编译器,用basiccc test.c-o test
命令编译了它,当我在提示符下键入3 4时,它会打印给我什么当您将x
和y
声明为int
s时发生?当我尝试运行该程序时,它崩溃,并显示消息“检测到堆栈崩溃”。我认为scanf
和printf
试图处理太多的字节。你知道这样的问题被问了多少次吗?如果你花时间在谷歌上搜索“scanf错误”或其他东西,或者更好的是“scanf手册”…如果替换为long
,那么在所有情况下都使用%ld
作为格式说明符,我不确定它在C中是否一定是未定义的行为,这只是不可取的行为。只有两个char
s是未定义的(据我所知),但是如果程序声明sizeof(int)+1
字符,并且只将前两个字符传递到scanf
中,那么当函数将char*
视为int*
时,可能会定义(并且不需要)@ilent2,该行为将是未定义的。在C中的强制转换不是很好吗(或者只有在将某个对象强制转换为void*
)时才好吗?@ilent2,您可以将int*
强制转换为char*
,然后返回。只要原始指针是有效的int*
@ilent2,就可以了:根据7.21.6.2/10的定义,行为确实是未定义的。OP需要将x
和y
的类型更改为int
,或者他需要使用%hhd
转换说明符。我认为您应该补充一点,该表适用于scanf
(和相关函数),而不适用于printf
(和相关函数)
Conversion Specifier Type
-------------------- ----
%d int *
%hd short *
%hhd char * (when reading a numeric value to char type)
%ld long *
%lld long long *
%u unsigned *
%hu unsigned short *
%hhu unsigned char *
%lu unsigned long *
%llu unsigned long long *