为scanf指定一个值,该值需要两个行为异常 #包括 int main() { int x,y; printf(“请输入2个数字:\n”); scanf(“%d,%d”,&x,&y); printf(“现在x的值是%d,y的值是%d”,x,y); 返回1; }
我输入两个数字并用为scanf指定一个值,该值需要两个行为异常 #包括 int main() { int x,y; printf(“请输入2个数字:\n”); scanf(“%d,%d”,&x,&y); printf(“现在x的值是%d,y的值是%d”,x,y); 返回1; },c,scanf,C,Scanf,我输入两个数字并用,将它们分开,然后事情就如预期的那样进行了 但如果我给出一个2345号,就会出现一个奇怪的结果: 现在x的值是3456,y的值是32767 我不明白为什么会这样。当您调用scanf()时,必须检查该函数的返回值以查看它是否成功。在我的系统上,有文档记录返回分配的输入项的数量。当您调用scanf()时,必须检查该函数的返回值以查看它是否成功。在我的系统上,有文件记录返回分配的输入项数量。这个奇怪的值是内存垃圾。在C语言中,所有未初始化的变量(除了static和extern)都指向
,
将它们分开,然后事情就如预期的那样进行了
但如果我给出一个2345号,就会出现一个奇怪的结果:
现在x的值是3456,y的值是32767
我不明白为什么会这样。当您调用scanf()
时,必须检查该函数的返回值以查看它是否成功。在我的系统上,有文档记录返回分配的输入项的数量。当您调用scanf()
时,必须检查该函数的返回值以查看它是否成功。在我的系统上,有文件记录返回分配的输入项数量。这个奇怪的值是内存垃圾。在C语言中,所有未初始化的变量(除了static
和extern
)都指向内存垃圾。
当您使用此变量的值时,任何情况都可能发生。您必须初始化此变量的值并检查返回值
正如@Michael Dorst在评论中提到的那样,将x
和x
设置为一些unsum值(例如,-1),在scanf()
调用之后,检查它们的值是否也发生了更改。这个奇怪的值是内存垃圾。在C语言中,所有未初始化的变量(除了static
和extern
)都指向内存垃圾。
当您使用此变量的值时,任何情况都可能发生。您必须初始化此变量的值并检查返回值
正如@Michael Dorst在评论中提到的,将
x
和x
设置为一些unsum值(例如,-1),然后在scanf()
调用之后,检查它们的值是否也发生了更改。这是因为您的scanf语句。
通常,scanf语句具有这种格式:
#include<stdio.h>
int main()
{
int x,y;
printf("please input 2 numbers:\n");
scanf("%d,%d",&x,&y);
printf("Now the value for x is %d, and value for y is %d",x,y);
return 1;
}
但您已经制作了以下格式:
scanf("%d %d",&x,&y); //without the commas inside the ""'s
这意味着您需要在两个输入之间使用逗号分隔符。
看看下面的试验
TRIAL1:(注:输入为2345)
TRIAL2:(注:输入为23,45)
试验三:(注:输入为23+45)
因此,根据试验,scanf(“%d,%d”、&x和&y)要求输入具有逗号分隔符。第一次和第三次试验的结果是,y变量确实包含垃圾,因为这些y值保持不变/未初始化。但是由于scanf上的第一个%d,x变量似乎得到了正确的值。这是因为scanf语句。 通常,scanf语句具有这种格式:
#include<stdio.h>
int main()
{
int x,y;
printf("please input 2 numbers:\n");
scanf("%d,%d",&x,&y);
printf("Now the value for x is %d, and value for y is %d",x,y);
return 1;
}
但您已经制作了以下格式:
scanf("%d %d",&x,&y); //without the commas inside the ""'s
这意味着您需要在两个输入之间使用逗号分隔符。
看看下面的试验
TRIAL1:(注:输入为2345)
TRIAL2:(注:输入为23,45)
试验三:(注:输入为23+45)
因此,根据试验,scanf(“%d,%d”、&x和&y)要求输入具有逗号分隔符。第一次和第三次试验的结果是,y变量确实包含垃圾,因为这些y值保持不变/未初始化。但是,由于scanf上的第一个%d,x变量似乎得到了正确的值。为什么在您的系统上?文档不符合C标准?Jack我希望我能投票两次。说真的,你为什么要告诉我们你的系统?告诉我们标准是怎么说的。我的系统恰好遵循标准,至少在这个例子中是这样。我建议使用他们自己的系统进行OP检查,因为值32767使我相信他们可能使用的是16位系统,这可能遵循不同的(旧的)规则。例如,一些旧的标准前运行库将返回scanf()接受的字符数,而不是转换的参数数(是的,这些参数很难使用)。为什么在您的系统上?文档不符合C标准?Jack我希望我能投票两次。说真的,你为什么要告诉我们你的系统?告诉我们标准是怎么说的。我的系统恰好遵循标准,至少在这个例子中是这样。我建议使用他们自己的系统进行OP检查,因为值32767使我相信他们可能使用的是16位系统,这可能遵循不同的(旧的)规则。例如,一些旧的标准前运行库将返回
scanf()
接受的字符数,而不是转换的参数数(是的,这些参数很难使用)。为什么返回1
?这意味着失败。这是未定义的行为。但是scanf可能正在从堆栈顶部读取要存储在y中的值。x
和y
在调用scanf()
之前具有未定义的值。将它们设置为0
或-1
或任何其他已知值,然后查看调用scanf()
后会发生什么。我同意。可能是这些号码在调用scanf之前就存在了。但是不管怎样,我对你得到奇怪的值并不感到惊讶。@JSN是的,我在调试器中打开了它,它从错误的堆栈帧中提取了一个值。你为什么返回1
?这意味着失败。这是未定义的行为。但是scanf可能正在从堆栈顶部读取要存储在y中的值。x
和y
在调用scanf()
之前具有未定义的值。将它们设置为0
或-1
或任何其他已知值,然后查看调用scanf()
后会发生什么。我同意。可能是这些号码在调用scanf之前就存在了。但不管怎样,我对你们得到奇怪的值并不感到惊讶。@JSN是的,我在我的调试器中打开了它,它正在拉
Please input 2 numbers:
23,45
Now the value for x is 23, and the value for y is 45.
Please input 2 numbers:
23+45
Now the value for x is 23, and the value for y is 134513867.