2015-04-03 1 views
1

У меня есть следующий код:Неприятности с функцией Scanf (C)

struct punto richiedi_punto() { 
static int count=1; 
struct punto point; 

do { 
printf("Inserire coordinate del punto %i:", count); 
scanf("%d;%d",&point.x,&point.y); 

} while (point.x<0 || point.x>9 || point.y<0 || point.y>9); 
count++; 

return point; 
} 

Gcc не находит ошибок, но я получаю это предупреждение:

Warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] 

Я пытался выяснить, решение на google, но я не понял, что вызывает это предупреждение.

Заранее спасибо.

EDIT: Я заметил, что если я запустил свою программу в консоли MonoDevelop, я не могу вставить мои координаты (почему?), Но если я запустил ее в gnome-terminal, она работает нормально.

+0

Удалить ';' из scanf (между 2% d's) –

+0

Что такое тип x и y? можете ли вы дать полный код? – Mukit09

+0

@karma_geek, Почему? –

ответ

1

scanf() возвращает количество полей успешно конвертируется, для вас, чтобы проверить

int fields; 
do { 
    printf("Inserire coordinate del punto %i:", count); 
    fields = scanf("%d;%d",&point.x,&point.y); 
} while (fields != 2 || point.x<0 || point.x>9 || point.y<0 || point.y>9); 

Как @chux указывает, выше, не хорошо. Вот версия, использующая sscanf вместо scanf.

#include <stdio.h> 

int main() 
{ 
    int fields, x, y; 
    char inp[100]; 
    do { 
     printf("Inserire coordinate:"); 
     fgets(inp, 100, stdin); 
     fields = sscanf(inp, "%d;%d",&x,&y); 
    } while (fields != 2 || x<0 || x>9 || y<0 || y>9); 
    printf("x=%d, y=%d\n", x, y); 
    return 0; 
} 
+0

'while (fields! = 2 || point.x <0 ....' является началом Хорошая идея, но обработка 'fields! = 2' скорее всего потребует другого пути, а затем цикла. Пользовательский ввод типа« 12 x 34 »вызовет бесконечный цикл. – chux

+0

@chux, поэтому я ненавижу' scanf'. –

+0

Мы могли бы надеяться следующий rev C отправит 'gets()' компаньон под названием 'scanf()'? – chux

-1

Scanf возвращает значение, которое No.of входа получить от успешного пользователя. Предупреждение: вы игнорируете это возвращаемое значение.

Таким образом, вы можете использовать, как это,

int ret; 
ret=scanf("%d;%d",&point.x,&point.y); 

Или еще,

(void*)scanf("%d;%d",&point.x,&point.y); 
-1

Это означает, что вы не проверять возвращаемое значение зсапЕ.
scanf может вернуть 1, если только point.x или point.y установлен или возвращается 0, если не установлено ни point.x, ни point.y.

вы можете проверить возвращаемое значение зсапЕ, чтобы удалить это предупреждение как то

int ret = scanf("%d;%d",&point.x,&point.y); 
if (ret != 2) 
{ 
    printf("Error whith scanf"); 
    return 0; 
} 
2

Посмотрите на scanf manual: возвращаемое значение функции является единственным способом для вас, чтобы знать, если функция успеха.

Здесь вашему компилятору не нравится ваш код, потому что вы даже не смотрите на возвращаемое значение, поэтому ваш код будет продолжен, даже если функция не удалась.

Ошибка здесь очень проста, например, если вход не является номером или не содержит символа ';' как ожидалось, или другие.

Так просто заменив Scanf линии что-то вроде:

if (scanf("%d;%d",&point.x,&point.y) != 2)) {} 

Должен успокоить ССАГПЗ, показывая ему, что вы заботитесь о возвращаемых значений. Но самым чистым решением было бы скорректировать возвращаемое значение и сделать что-то в зависимости от того, посмотрите дополнительную информацию в разделе «возвращаемое значение» руководства.

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

  • Нет связанных вопросов^_^