#include <stdio.h>
#include <string.h>
void parse(char *line, int x, int y){
sscanf(line,"%d %d", &x, &y);
}
int main(){
int x;
int y;
char *line = "2 3";
parse(line,x,y);
printf("exponent = %d and number = %d\n",x,y);
return 0;
}
我正在尝试获取具有x=2
和y=3
的正确值,但是当我运行时,我得到了x = -1659548064
和y = 32765
。
我的代码有什么问题?
在C中,传递的参数按值,例如x
和y
in
void parse(char *line, int x, int y){
sscanf(line,"%d %d", &x, &y);
}
是调用方用作参数的变量的副本。因此,对它们执行的任何赋值都不会对该函数产生任何影响。为什么看到那些奇怪的值?好吧,由于parse
不会影响x
和y
,因此它们将保持以前的值。但是由于您没有初始化它们,所以它们将具有随机值,具体取决于先前在它们的内存位置中存储的内容。
[无论何时参数是函数的输出(由于某种原因不能返回),都可以将其作为pointer传递:传递变量的地址,以便可以将输出存储在其中。] >
在这种情况下:
void parse(char *line, int *x, int *y){ sscanf(line,"%d %d", x, y); }
[
main
变为
int main(){ int x; int y; char *line = "2 3"; parse(line, &x ,&y); // <--- changes here!!! printf("exponent = %d and number = %d\n",x,y); return 0; }
所以:
parse()
接口以接受pointersparse
内,因为scanf
期望每个%d
都指向整数,所以我可以简单地传递x
和y
而不是像您的版本中那样传递&x
和&y
您需要传递x和y作为指针。