UTNianos

Versión completa: Consulta caracter vacio
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
Estoy luchando hace rato con esto y no puedo resolverlo... Necesito saber cómo se hace para hacer una comparación de caracter vacío en C..
Yo recibo un char por parámetro, un nombre (puede ser "juan" o ""), y si tiene valor imprime "buen día, nombre", pero sino debe imprimir sólo "buen día". Estoy con un condicional
if(Nombre == ????????????)
printf("Buen día.\n");
else
printf(""buen día, nombre");

En el if ya probé con todos los caracteres que se me ocurrieron, con Null, '\0', '\n', "", " ", ' '... y no funciona nada.. Alguno sabe cómo se hace!??!
NOTA: Recibo una constante fija por parámetro... es:
funcion("Juan);
funcion("");

Debería mostrar:
Buen día, Juan.
Buen día.

Y muestra:
Buen día, Juan.
Buen día, .
Probaste usando sizeof? o strlen?
Probá con el hexadecimal, creo que era 0x20.

Saludos
(17-05-2013 21:36)Elmats escribió: [ -> ]Probaste usando sizeof? o strlen?

No estoy familiarizada con esas funciones, pero por lo que acabo de ver, están preparadas para cadenas de caracteres (que asumo veré más adelante).. Esto no es una cadena, es simplemente un char vacío.. Cómo podría hacerlo?

(17-05-2013 21:41)guriwashere escribió: [ -> ]Probá con el hexadecimal, creo que era 0x20.

Saludos

Eso lamentablemente no funcionó =(
Pero si vos le estas pasando una cadena de caracteres como argumento a una funcion, eso es un string no un char.
Si estas pasando un nombre de mas de un char necesariamente tiene que ser un puntero a char, lo que puede ser interpretado como un string.
Mas alla de que la comparacion la hagas sobre un char.

Yo pondria:

if ((Nombre[0]=='\n')||(Nombre[0]=='\0')) // Comparas el primer caracter de la cadena con el salto de linea y el fin de cadena a la vez, depende que funcion estes usando para tomar el nombre te toma el enter o no te pone el salto de linea..

sino como te dijeron, con strlen:

if (strlen(Nombre)==0)
+1 al \n, o \r, o \r\n
(17-05-2013 21:49)JulianD escribió: [ -> ]Pero si vos le estas pasando una cadena de caracteres como argumento a una funcion, eso es un string no un char.
Si estas pasando un nombre de mas de un char necesariamente tiene que ser un puntero a char, lo que puede ser interpretado como un string.
Mas alla de que la comparacion la hagas sobre un char.

Yo pondria:

if ((Nombre[0]=='\n')||(Nombre[0]=='\0')) // Comparas el primer caracter de la cadena con el salto de linea y el fin de cadena a la vez, depende que funcion estes usando para tomar el nombre te toma el enter o no te pone el salto de linea..

sino como te dijeron, con strlen:

if (strlen(Nombre)==0)

Mi código es exactamente:
void Saludar( const char* Nombre ){

if(Nombre == ????)
printf("Buen dia.\n");
else
printf("Buen dia, %s.\n",unNombre);
return;


Cuando le trato de poner como cadena, no me lo acepta, me tira error al compilar, y el strlen, no lo tengo, sólo puedo usar la libreria stdio.. y esa funcion esta en otra libreria..
Lo que podés hacer tambien, es tener el string, y despues mostrar su valor numerico, para saber que caractér te está poniendo.

O sea, definitivamente por lo que contas, "Nombre" no tiene el caracter vacío solo (O sea, Nombre != '\0'), si no que tal vez tiene algun caracter más (un salto de linea, por ejemplo).

Haciendo algo así:

int i;
for(i=0;i<strlen(Nombre)+1;i++){
printf("%d",Nombre[i]);
}

vas a ver el valor de cada byte de la cadena Nombre.

Si fuese el caracter vacío, entonces tendría que aparecerte "0".

Recordá tambien que todo string termina en '\0', así que si es una cadena que tiene un salto de linea, en realidad su valor va a ser:
Nombre[0] = '\n';
Nombre[1] = '\0';
Nombre[2] = <basura, tal vez si accedes a 2 te tire segfault>

Por eso JulianD pregunta por Nombre[0].

Cita:Cuando le trato de poner como cadena, no me lo acepta, me tira error al compilar, y el strlen, no lo tengo, sólo puedo usar la libreria stdio.. y esa funcion esta en otra libreria..

A lo que dije antes, hacé esto:

int i;
for(i=0;Nombre[i] != '\0';i++){
printf("%d",Nombre[i]);
}

Si Nombre = '\0' entonces no tendría que aparecerte nada.
Si Nombre = '
\0' te tendría que aparecer un numero solamente (El correspondiente a
).

Como dijo mas arriba JulianD, dependiendo de como tomes ese string, te toma el salto de linea o no. (si usaste scanf, getc, varía el string que vas a obtener)
(17-05-2013 21:52)Imakuni escribió: [ -> ]+1 al \n, o \r, o \r\n

No termino de comprender esto, si me estás sugiriendo que haga if(Nombre == ('\n'+1)), lo hice y no funciona... Sino cómo sería?
(17-05-2013 21:49)JulianD escribió: [ -> ]Pero si vos le estas pasando una cadena de caracteres como argumento a una funcion, eso es un string no un char.
Si estas pasando un nombre de mas de un char necesariamente tiene que ser un puntero a char, lo que puede ser interpretado como un string.
Mas alla de que la comparacion la hagas sobre un char.

Yo pondria:

if ((Nombre[0]=='\n')||(Nombre[0]=='\0')) // Comparas el primer caracter de la cadena con el salto de linea y el fin de cadena a la vez, depende que funcion estes usando para tomar el nombre te toma el enter o no te pone el salto de linea..

sino como te dijeron, con strlen:

if (strlen(Nombre)==0)

oe pregunta, eof no es -1? no podes tirar magia y meterlo directamente en la condicion del else?
Ahhh, disculpame, el 0x20 es el espacio ....

probá esto



if (sizeof (cadena) < 1) {
// tarea
} else {
// otra cosa
}



void saludar(const char* nombre) {

if (nombre[0] == '\0' || nombre[0] == '\n')
puts ("Buen Dia.");
else
printf("Buen Dia, %s.\n", nombre);
}


el return no te hace falta.
(17-05-2013 21:58)Imakuni escribió: [ -> ]Lo que podés hacer tambien, es tener el string, y despues mostrar su valor numerico, para saber que caractér te está poniendo.

O sea, definitivamente por lo que contas, "Nombre" no tiene el caracter vacío solo (O sea, Nombre != '\0'), si no que tal vez tiene algun caracter más (un salto de linea, por ejemplo).

Haciendo algo así:

int i;
for(i=0;i<strlen(Nombre)+1;i++){
printf("%d",Nombre[i]);
}

vas a ver el valor de cada byte de la cadena Nombre.

Si fuese el caracter vacío, entonces tendría que aparecerte "0".

Recordá tambien que todo string termina en '\0', así que si es una cadena que tiene un salto de linea, en realidad su valor va a ser:
Nombre[0] = '\n';
Nombre[1] = '\0';
Nombre[2] = <basura, tal vez si accedes a 2 te tire segfault>

Por eso JulianD pregunta por Nombre[0].

Cita:Cuando le trato de poner como cadena, no me lo acepta, me tira error al compilar, y el strlen, no lo tengo, sólo puedo usar la libreria stdio.. y esa funcion esta en otra libreria..

A lo que dije antes, hacé esto:

int i;
for(i=0;Nombre[i] != '\0';i++){
printf("%d",Nombre[i]);
}

Si Nombre = '\0' entonces no tendría que aparecerte nada.
Si Nombre = '
\0' te tendría que aparecer un numero solamente (El correspondiente a
).

Como dijo mas arriba JulianD, dependiendo de como tomes ese string, te toma el salto de linea o no. (si usaste scanf, getc, varía el string que vas a obtener)


Hice
int i;
for(i=0;Nombre[i] != '\0';i++){
printf("%d",Nombre[i]);
}
como sugeriste.. y cuando le mando el "", esto me devuelve 0... Por lo cual si le manda la cadena vacía.. o sigue sin funcionar el '\0' xD
(17-05-2013 22:07)mercevico escribió: [ -> ]Hice
int i;
for(i=0;Nombre[i] != '\0';i++){
printf("%d",Nombre[i]);
}
como sugeriste.. y cuando le mando el "", esto me devuelve 0... Por lo cual si le manda la cadena vacía.. o sigue sin funcionar el '\0' xD

el problema es que le ponés %d para imprimir un número. con %c te muestra el caracter, aunque si le ponés \0 no te va a mostrar nada.

Para verificar podés poner un if:
int c = nombre[i];
c != '\0' ? printf("%c", c) : printf("\0");
(17-05-2013 22:03)Maik escribió: [ -> ]oe pregunta, eof no es -1? no podes tirar magia y meterlo directamente en la condicion del else?

Si no me equivoco, eof se usa cuando trabajas con ficheros (archivos).. Nose si se puede usar aca.

_____________

Podrias poner el codigo completo, incluido el main o lo que sea desde donde tomas el nombre?
Capaz ahi salta algo que aca no estamos viendo..
Páginas: 1 2
URLs de referencia