2013-11-09 3 views
-1

Я пытаюсь понять, как работает sscanf(). Я привел несколько примеров из этой страницы: http://docs.roxen.com/pike/7.0/tutorial/strings/sscanf.xml, и они не работают на моей платформе. Я не понимаю, почему. Например: «sscanf (« 4711bar »,«% d% s », a, b); делает выход программы с ошибкой ...Метод sscanf() неоднозначное поведение

Вот один из примеров, которые работают: «sscanf (« foo »,« f% s », a);». Кто-нибудь знает, почему? Они работают на ваших платформах? Спасибо.

Это мой код:

int main(void){ 

    char *b = (char*)malloc(sizeof(char)*100);  
    int a = 0; 

    sscanf("4711bar", "%d%s", a, b); 
    printf("%d", a); 
    printf("%s", b); 
} 
+0

Я уверен, вы не проходят действующие указатели на переменные ... –

+3

Документация вы смотрите на ** не для C или C++, но совсем по другой язык * *. –

+0

Кроме того, [не набрасывайте возвращаемое значение 'malloc()'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858). –

ответ

1

Вы должны написать: sscanf("4711bar", "%d%s", &a, b); & делает &a является указатель на a и sscanf требует указателей.

Второй пример работает, потому что a - это массив. И массив a типа char[100] принудительно преобразован в указатель типа char *, указывающий на первый элемент массива (a[0]). Так a такое же, как &(a[0])

int a; 
char b[100]; 
sscanf("4711bar", "%d%s", &a, b); 

-

char a[100]; 
sscanf("foo", "%s", a); 
+0

Почему это не работает с указателем на char, как char * b, и это происходит с массивом символов? –

+0

«И имя массива является указателем на его первый элемент». - это не так, но он ** неявно преобразуется в ** указатель на свой первый элемент. –

+0

@CarmenCojocaru Поскольку неинициализированный указатель не указывает на какую-либо действительную память. –

0

Вы должны пройти действующие указатели на sscanf, &a для целого и b строки:

sscanf("4711bar", "%d%s", &a, b); 
         ^

Кроме того, ваш код C-ish не C++. Использование C++ это должно выглядеть примерно так:

std::stringstream s; 
s << "4711bar"; 

int a; 
std::string b; 

s >> a >> b; 
Смежные вопросы