为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.