使用%d从sscanf获取错误的输出

问题描述 投票:0回答:2
#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=2y=3的正确值,但是当我运行时,我得到了x = -1659548064y = 32765

我的代码有什么问题?

c pointers parameter-passing scanf
2个回答
2
投票

在C中,传递的参数按值,例如xy in

void parse(char *line, int x, int y){
    sscanf(line,"%d %d", &x, &y);
}

是调用方用作参数的变量的副本。因此,对它们执行的任何赋值都不会对该函数产生任何影响。为什么看到那些奇怪的值?好吧,由于parse不会影响xy,因此它们将保持以前的值。但是由于您没有初始化它们,所以它们将具有随机值,具体取决于先前在它们的内存位置中存储的内容。

[无论何时参数是函数的输出(由于某种原因不能返回),都可以将其作为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()接口以接受pointers
  • 为整数
  • parse内,因为scanf期望每个%d都指向整数,所以我可以简单地传递xy而不是像您的版本中那样传递&x&y

0
投票

您需要传递x和y作为指针。

© www.soinside.com 2019 - 2024. All rights reserved.