这个基本的C程序总是得到错误的答案,尤其是x总是0,y的值是正确的 #包括 int main(){ 字符x,y; scanf(“%d%d”,&x,&y); printf(“%d%d”,x,y); }

这个基本的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

例如: 我输入“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, 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编译器,用basic
cc 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 *