2015-06-24 2 views
0
float fahrenheit; 
float celsius; 
float formulaf = (fahrenheit - 32.0) * 5/9; 
char str[20]; 
float formulac = celsius * 9/5 + 32.0; 
printf("Choose either fahrenheit or celsius; "); 
scanf("%*s", &str); 
if (strcmp(str, "fahrenheit") ==0) 
{ 
    printf("Enter the temperature in fahrenheit: "); 
    scanf("%f", &fahrenheit); 
    printf("%.2f fahrenheit is %.2f celsius", fahrenheit, formulaf); 
} 
else 
{ 
    printf("Enter the temperature in celsius: "); 
    scanf("%f", &celsius); 
    printf("%.2f celsius is %.2f fahrenheit", celsius, formulac); 
} 

Я кодирую это в xcode, я создал заголовки и все, это основная часть, где я застрял, она дает ошибку в следующем код, и это дает контрольные точки в некоторых других линий, пожалуйста, помогите мне решить этуПочему эта ошибка возникает в c

scanf("%*s", &s); -------> аргумент данных не используется строка формата

что это значит?

+2

Вам нужно изучить, как работают целые числа и переменные с плавающей запятой. Например, '5/9' не имеет никакого смысла в C. – Lundin

+0

Спасибо, что напомнили мне, hhehehe – user5032369

ответ

1

%*s поручает scanf сканировать и отбросить отсканированное жало. Компилятор жалуется, потому что второй аргумент этого scanf (&s) не используется.

Вы, вероятно, хотели использовать %s или %19s (говорит scanf сканировать максимум 19 символов + 1 для NUL-терминатор), которые предотвращают переполнение буфера.

Также измените второй аргумент scanf на s. Это сделано потому, что %s ожидает char*, а &s имеет тип char(*)[20]. s преобразуется в &s[0], a char*, именно то, что %s ожидает.

Так scanf

scanf("%*s", &str); 

должен быть

scanf("%s", str); 

по причинам, изложенным выше.


BTV, Ваш код имеет неопределенное поведение, потому что при использовании

float formulaf = (fahrenheit - 32.0) * 5/9; 

и

float formulac = celsius * 9/5 + 32.0; 

farenheit и celsius не инициализированы. Переместить его после того, как они инициализируются, то есть, после того, как переместить его

scanf("%f", &fahrenheit); 

и

scanf("%f", &celsius); 

соответственно.

+0

И не могли бы вы объяснить, почему я не должен использовать & str в моем коде? – user5032369

+0

@ user5032369, Возможно, это сработало для вашего друга. Но неопределенное поведение не определено.Это может сработать, может и нет, или сделать что-то странное. Это может перестать работать над добавлением простой 'printf' где-то и т. Д. И т. Д. Прочитайте третий абзац моего ответа, чтобы узнать, почему вам нужно использовать' str' вместо '& str'. Кроме того, просмотрите похожие вопросы в StackOverflow, например [this] (http://stackoverflow.com/questions/8921617/c-why-no-for-strings-in-scanf-function) –

2

Если вы читаете, например, this scanf reference вы увидите, что модификатор "*" в строке формата означает, что отсканированная строка не будет использоваться.

Кроме того, при сканировании строк вы не должны использовать адрес-оператора, поскольку строки уже являются указателями.