2015-09-14 2 views
-2

У меня есть некоторые проблемы с sscanf_s, когда я хочу извлечь два символа.sscanf_s с double% c

Пример кода:

#include "stdafx.h" 
#include <iostream> 
#include <string.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char* text = "ab"; 
    char a = ' '; 
    char b = ' '; 

    sscanf_s(text, "%c%c", &a, &b); //the same problem when I use %1c%1c 

    return 0; 
} 

Это не работает, когда я запускаю его:

Необработанное исключение в 0x0F76D6AC (msvcr120d.dll) в ConsoleApplication2.exe: 0xC0000005: нарушение прав доступа письменной форме место 0x00000000.

Когда я пытаюсь использовать два целых числа, таких как %i%i, тогда все работает.

+3

'% c' из' sscan_f'need параметра размера. Например 'sscanf_s (текст,«% c% c », & a, 1, &b, 1);' ref [sscanf_f] (https://msdn.microsoft.com/en-us/library/t6z7bya3.aspx) – BLUEPIXY

+5

** ПРОЧИТАЙТЕ ДОКУМЕНТАЦИЮ ** –

+2

Почему вы '#include ' тогда просто и 'sscanf'? – crashmstr

ответ

5

Необходимо указать размер.

[...] за исключением того, что %c, %s и %[ преобразования спецификаторов каждый ожидать два аргумента (обычный указатель, а значение типа rsize_t, указывающее размер приемного массива, который может быть 1 при чтении с% с в единый полукокса

для справки -. http://en.cppreference.com/w/c/io/fscanf

так использовать 1 как размер, чтобы читать в одну char

Перепишите, как это -

sscanf_s(text, "%c%c", &a,(rsize_t)1,&b,(rsize_t)1); 
    //explicit casts as corrected in comments by chux 
+0

Размер должен быть типом' rsize_t'. '1' является типом' int'. – chux

+0

@chux Да, сэр я согласен, но если вы видите примеры, это указано в [MSDN] (https://msdn.microsoft.com/en-us/library/w40768et.aspx), а также [здесь] (http://en.cppreference.com/ w/c/io/fscanf), в то время как ввод данных в один символ «char» может быть равен «1». Это был бы другой случай, если бы это был массив. – ameyCU

+0

Проблема не _value_. 1 - это правильный _value_. '1' не является правильным _type_. Обе предоставленные ссылки не используют голый' 1'. Эти примеры будут подразумевать '_countof (a)' и '(rsize_t) sizeof (a)' или просто 'sscanf_s (текст, % c% c ", & a, (rsiz e_t) 1, & Ь, (rsize_t) 1); '. – chux