Неправильный вывод из sscanf с использованием% d - PullRequest
0 голосов
/ 06 апреля 2020
#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.

Что не так в моем коде?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

В C, параметры, переданные по значению , например x и y в

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

, являются копиями переменных, используемых вызывающей стороной в качестве параметров. Таким образом, любое присвоение, выполненное для них, не будет иметь никакого эффекта вне функции Почему вы видите эти странные ценности? Ну, поскольку parse не влияет на x и y, они сохранят свои прежние значения. Но так как вы не инициализировали их, они будут иметь случайное значение в зависимости от того, что было ранее сохранено в их ячейках памяти.

Всякий раз, когда параметр является выходом функции (и по какой-то причине не может быть возвращен), он может быть передан как указатель : адрес переменной передан, так что выходные данные могут быть сохранены там.

В этом случае:

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() интерфейс, чтобы принимать указатели на целое число
  • в пределах parse, так как scanf ожидает указатель на целое число для каждого %d, я могу просто передать x и y вместо &x и &y как в вашей версии
0 голосов
/ 06 апреля 2020

Вам нужно передать x и y как указатели.

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...