2013-11-28 1 views
1

я эта проблема в C: Я пытаюсь создать свой собственный зсапЕ из-за отстающим, вот код:excepter «», «» „)“ перед „и“ маркера ошибка

int cScanf(int& out) 
{ 
     char buffer[5]; 
     fgets(buffer, 5, stdin); 
     return sscanf(buffer, "%d",&out); 
} 

и это, как я называю эту функцию в основной:

if (cScanf(typ) == 1 && (typ > -1 && typ < 37)) 

, но когда я пытаюсь скомпилировать свою программу, я получаю эту ошибку:

error: excepter ';', ',' ')'` before '&' token 

Какие-либо рекомендации по тому, как это решить?

+2

C не имеет ссылок ('int & out'). Вместо этого передайте указатель ('int * out'). – hmjd

+0

'Я пытаюсь создать свой собственный scanf из-за trailing', что !? – StoryTeller

ответ

2

Ваш код должен быть

int cScanf(int* out) 
{ 
     char buffer[5]; 
     fgets(buffer, 5, stdin); 
     return sscanf(buffer, "%d",*out); 
} 

И вам нужно передать адрес typ как

if (cScanf(&typ) == 1 && (typ > -1 && typ < 37)) 

Но я не уверен, что ваша логика работает или нет. Просто я исправил ошибку компиляции

+0

Вы передаете int ('* out') в scant, который ожидает int * – nio

+0

@nio Спасибо, изменен – Chinna

1

int cScanf(int &out)

Этот синтаксис C++, в C у вас нет ссылки. Вы должны использовать указатели вместо ...

int cScanf(int *out)

И поэтому ваш код должен быть:

int cScanf(int *out) 
{ 
     char buffer[5]; 
     fgets(buffer, 5, stdin); 
     return sscanf(buffer, "%d", out); 
} 

Вы должны выделить память для out (или typ) в вызове функции перед переходом к cScanf , Для этого вы можете использовать либо статическое распределение, как:

int input, rc; 
rc = cScanf(&input); 

или динамическое распределение:

int *p_input, rc; 
p_input = malloc(sizeof(int)); 
if(p_input != NULL) 
    rc = cScanf(p_input); 
2

При недостатке ссылок в C вы должны использовать указатель:

int cScanf(int* out) 
{ 
    char buffer[5]; 
    fgets(buffer, 5, stdin); 
    return sscanf(buffer, "%d", out); 
    // no & before out in sscanf argument, because it already is a pointer 
    // and it holds an address to int which sscanf expects. 
} 

Вызвать код следующим образом:

if (cScanf(&typ) == 1 && (typ > -1 && typ < 37)) 

С &typ вы получите адрес переменной typ, который вы можете использовать с аргументом указателя.

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