Почему указатель ведет себя иначе в некоторых случаях при передаче в функцию? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть этот пример кода, и я не могу понять, почему sscanf работает так, как задумано в функции примера, но не в основной функции.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void example(char *seq){
    char wert;
    while(*seq){
        sscanf(seq,"%2x",&wert);
        fprintf(stdout,"%c",wert);
        seq+=2;
    }
}

int main() {
    char temp;
    char sentence []="1B2873313648";
    char *seq=sentence;
    example(seq);
    printf("\n");
    while(*seq){
        sscanf(seq,"%2x",&temp);
        fprintf(stdout,"%c",temp);
        seq+=2;
    }
}

1 Ответ

4 голосов
/ 02 мая 2019

Спецификатор формата sscanf %x ожидает указатель на unsigned int, а не указатель на char, поэтому все ставки отключены из-за неопределенного поведения .Пожалуйста, обратите внимание на предупреждения компилятора.На моем MSVC этот код вызывает сбой.

Этот исправленный код работает.

#include <stdio.h>          // missing
#include <stdlib.h>
#include <string.h>

void example(char *seq){
    unsigned wert;
    while(*seq){
        sscanf(seq,"%2x",&wert);
        fprintf(stdout,"%02X ",wert);
        seq+=2;
        //fflush(stdin);
    }
}

int main() {
    unsigned temp;
    char sentence []="1B2873313648";
    char *seq=sentence;
    example(seq);
    printf("\n");
    while(*seq){
        sscanf(seq,"%2x",&temp);
        fprintf(stdout,"%02X ",temp);
        seq+=2;
        //fflush(stdin);
    }
}

Вывод программы:

1B 28 73 31 36 48
1B 28 73 31 36 48
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...