C - Условно всегда переходить на «остальное»? - PullRequest
3 голосов
/ 11 февраля 2012

Я работаю над изучением C и использую некоторые практические проблемы из недавно написанной книги по Python.Моя C книга находится в почте, но я хотел получить преимущество.Я составлял простую программу преобразования температуры, и по какой-то причине она всегда переходит к условию «Остальное» в моем условном выражении ... Я уверен, что упускаю что-то простое, но, похоже, не могу понять это.Есть идеи?

1002 *

Ответы [ 5 ]

7 голосов
/ 11 февраля 2012

Если вы сравниваете символы, сделайте следующее:

char convert_from; 

printf("Convert from (c or f): "); 
scanf("%c", &convert_from); 

if (convert_from == 'c') 
{ 

В противном случае вы не сможете выполнить сравнение со строковым литералом "c" (обратите внимание на двойные кавычки), например.

2 голосов
/ 11 февраля 2012

В выражении:

if (convert_from == "c")
Массив

convert_from преобразуется в указатель на char, поэтому вы в основном сравниваете указатель на char с другим указателем на char. "c" является строковым литералом, а 'c' является char (обратите внимание на использование "" в первом случае и '' во втором случае).

С объявлением char convert_from[1]; здесь будет правильный код:

char convert_from[1];
scanf("%c", convert_from);
if (convert_from[0] == 'c')

но более естественно напрямую использовать char вместо массива 1 из char:

char convert_from;
scanf("%c", &convert_from);
if (convert_from == 'c')
1 голос
/ 11 февраля 2012

В C вы не можете сравнивать строки, используя == (что произойдет, если вы выполните сравнение мест в памяти строк, что в большинстве случаев даст разные результаты).

Также scanf("%c", &convert_from); не так. Сам массив уже превратится в указатель, поэтому достаточно scanf("%c", convert_form);. В этом случае, однако, convert_form не будет содержать что-то, что ваша библиотека C будет считать строкой (строки заканчиваются нулем в C). Минимально инвазивное изменение для того, чтобы заставить ваш код работать, будет меняться

if (convert_from == "f") [...]

до

if (covert_form[0] == 'f') [...]

(обратите внимание на '' вместо "", который является символьным литералом, который в основном является просто числом и, таким образом, может сравниваться с использованием ==).

Более идиотский способ сделать это - объявить convert_form как char convert_form, а затем использовать scanf("%c", &convert_form);, что будет соответствовать описанному выше.

1 голос
/ 11 февраля 2012

Ну, две проблемы здесь.

Во-первых: вы хотите прочитать только один символ, поэтому вместо * массива символов размером 1 (как char convert_from[1]) было указано

char convert_from;

.* А во-вторых, вам нужно сравнить с одним символом, поэтому вам нужно будет сделать

if (convert_from == 'c') ...

вместо "c", потому что "foo" - это строка в C, которая в свою очередь является указателемконстантный массив символов (const char *).

Дополнительно: какой компилятор вы использовали?Мой (llvm-gcc 4.2) предупредил меня о проблемах.Так что либо ваш компилятор довольно поддельный, либо вам срочно придется обратить внимание на предупреждения компилятора.Это может быть сложно, так как предупреждения не являются ошибками, однако предупреждения существуют по причине: -)

0 голосов
/ 11 февраля 2012

Прежде всего, поскольку вы читаете только один символ за раз определить его как

char convert_from;

далее не рекомендуется сравнивать строки напрямую следовательно, утверждение должно быть

if(convert_from == 'c')
...