
joe scho
Los siguientes fragmentos de código son de un programa C.
El usuario ingresa Y o N.
char *answer="\0";
scanf (" %c", answer);
if (*answer == ('Y' || 'y'))
// do work
No puedo entender por qué esto if
declaración no se evalúa como verdadera.
Revisé la entrada y o n con un printf
y está ahí, así que sé que estoy recibiendo la entrada del usuario. Además, cuando reemplazo la condición de la declaración if con 1 (haciéndola verdadera), se evalúa correctamente.

coadicto
Veo dos problemas:
el puntero answer
es un null
puntero y está tratando de desreferenciarlo en scanf
esto lleva a comportamiento indefinido.
no necesitas un char
puntero aquí. Solo puedes usar un char
variables como:
char answer;
scanf(" %c",&answer);
Siguiente para ver si el carácter de lectura es 'y'
o 'Y'
deberías hacer:
if( answer == 'y' || answer == 'Y') {
// user entered y or Y.
}
Si tu De Verdad necesita usar un puntero de caracteres, puede hacer algo como:
char var;
char *answer = &var; // make answer point to char variable var.
scanf (" %c", answer);
if( *answer == 'y' || *answer == 'Y') {

marca eliot
answer
no debería ser un puntero, la intención es obviamente mantener un carácter. scanf
toma la dirección de este personaje, por lo que debe llamarse como
char answer;
scanf(" %c", &answer);
A continuación, su declaración “o” está formada incorrectamente.
if (answer == 'Y' || answer == 'y')
Lo que escribiste originalmente pide comparar answer
con el resultado de 'Y' || 'y'
que supongo que no es exactamente lo que querías hacer.

paxdiablo
Para empezar, su answer
la variable debe ser del tipo char
no char*
.
En cuanto a if
declaración:
if (answer == ('Y' || 'y'))
Esto es primero evaluar 'Y' || 'y'
lo cual, en lógica booleana (y para ASCII) es verdadero ya que ambos son “verdaderos” (distintos de cero). En otras palabras, sólo obtendrías la if
declaración para disparar si de alguna manera hubieras ingresado CONTROLUN (nuevamente, para ASCII, y donde los valores verdaderos equivalen a 1)*un.
Tú podría Usa la más correcta:
if ((answer == 'Y') || (answer == 'y'))
pero realmente deberías estar usando:
if (toupper(answer) == 'Y')
ya que esa es la forma más portátil de lograr el mismo fin.
*un Quizás se pregunte por qué estoy poniendo todo tipo de condicionales para mis declaraciones. Si bien la gran mayoría de las implementaciones de C usan ASCII y ciertos valores conocidos, los estándares ISO no lo exigen necesariamente. Sé con certeza que al menos un compilador todavía usa EBCDIC, por lo que no me gusta hacer suposiciones injustificadas.

Hobbs
Porque la comparación no funciona de esa manera. 'Y' || 'y'
es un operador lógico o; vuelve 1
(verdadero) si alguno de sus argumentos es verdadero. Ya que 'Y'
y 'y'
ambos son ciertos, estás comparando *answer
con 1
lo que quieres es if(*answer == 'Y' || *answer == 'y')
o quizás:
switch (*answer) {
case 'Y':
case 'y':
/* Code for Y */
break;
default:
/* Code for anything else */
}