2017-01-18 4 views
2

Привет У меня проблемы с sscanf. Я просто пытаюсь написать простую тестовую программу, чтобы помочь мне понять, как это работает. Проблема возникает при записи в разные переменные с sscanf. Вот то, что их значения должны быть:Проблемы Sscanf с C

IP = 175.85.10.147

число = 2589

электронная почта = [email protected]

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

int main() { 
    char *toSend = "175.85.10.147:2589:[email protected]"; 
    int *number; 
    char IP[200]; 
    char email[300]; 
    sscanf(toSend, "%[^:]: %i%[^:]: ", IP, number, email); 
    printf("%s", IP); 
    printf("%i", number); 
    printf("%s", email); 
    return 0; 
} 

IP-он печатает правильно.

Число не печатается правильно, что может быть связано с этим предупреждением. Я получаю во время компиляции: format '%i' expects argument of type 'int' but argument 2 has type 'int *'.

Переменная email по какой-то причине содержит странные персонажи.

+0

Вы передали указатель на int в качестве аргумента функции, которая принимает int в этой позиции. удалите '*' из объявления переменной, чтобы он читал «int number» и посмотрел, работает ли это. – ocket8888

+0

Ну, давайте сначала поговорим о предупреждении. '% i' ожидает' int', и вы даете ему 'number', который является' int * '. – DeiDei

+2

'int * number;' -> 'int number;', 'sscanf (toSend,"% 199 [^:]:% i:% 299s ", IP, & number, email);' – BLUEPIXY

ответ

3

Вам необходимо некоторое количество памяти для хранения количества

т.е. изменить

int *number; 

в

int number; 

Затем используйте

sscanf(toSend,"%[^:]:%i:%[^:]",IP, &number, email); 

Я также исправить опечатки - здесь код http://ideone.com/hpqGDZ

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 
int main(){ 
    char *toSend = "175.85.10.147:2589:[email protected]"; 
    int number; 
    char IP[200]; 
    char email[300]; 
    if (sscanf(toSend, "%199[^:]:%i:%299[^:]", IP, &number, email) != 3) { 
    return 1; 
    } 
    printf("%s\n", IP); 
    printf("%i\n", number); 
    printf("%s\n", email); 
    return 0; 
} 
+0

Я не думаю, что передача ссылки на 'number' верна, что все равно будет иметь тип' int * ', не так ли? – ocket8888

+0

Почему проголосовать –

+0

@BLUEPIXY - Хорошая точка –

Смежные вопросы