Encontrar si un carácter está dentro un string

Iniciado por pirojoke, 4 Febrero 2018, 02:17 AM

0 Miembros y 1 Visitante están viendo este tema.

pirojoke

Buenas! Pues el problema es que el visual no da ningún resultado al ejecutar el códico y no puedo encontrar dónde me he equivocado.


#include <iostream>
using namespace std;

int EncontrarCaracter(char cad[], char n)
{
int i = 0;
int res = 0;

while ((res == 0) || (cad[i] != '\0')) {
if (cad[i] == n)
res = 1;
else
i++;
}
return res;
}

int main()
{
int resultado;
char cadena[100], n;
cin >> cadena >> n;
resultado = EncontrarCaracter(cadena, n);
cout << resultado << endl;
system("PAUSE");
return 0;
}

srWhiteSkull

Buenas, antes que nada una explicación para novatos. El C++ es C orientado a objetos, eso significa que C++ trabaja con objetos. Los objetos tienen muchas peculiaridades y entre ellas que puedes usar métodos etc.. (no entraré en más detalle en POO).

Luego lo segundo, eso no es un string. Eso que tienes declarado es un literal de caracteres, cadena? (que podría ser la traducción literal de string) o array de chars o caracteres o montón de cosas pero no un string (objeto). Un string es un objeto en C++ y tiene métodos como antes cité. Entre los métodos disponibles tienes el find(), que es para encontrar ya no un carácter sino también palabras o cadenas.

Se incluye con su correspondiente cabecera <string>
http://www.cplusplus.com/reference/string/

Info y how to del string en visual c++ (hay un ejemplo con el find()):
https://msdn.microsoft.com/es-es/library/syxtdd4f.aspx

dijsktra

#2
Como mínimo, en la condición del bucle while.

while ((res == 0) || (cad[i] != '\0')) {

Cambiando el operador || (OR) por && (AND)

while ((res == 0)  && (cad[i] != '\0')  ) {

De todas formas, aunque este disponible como


#include <string.h>

char *strchr(const char *s, int c);


como ejercicio de programación , yo haría esta:

int EncontrarCaracter(const char cad[], const char n)
{
 const char *c;
 for ( c=cad; *c && (*c!=n);c++);
 return *c;
}


Es un poco crípitica, pero my C-style... Devuelve 0 si no esta, o el valor decimal del caracter ASCII si esta...


Ojo! Sería ambiguo preguntar por el caracter "\0", ya que en toda cadena de C, está, y devolvería precisamente 0, que es su valor en decimal...

Entoces... está o no está? Parece que está, pero el convenio escogido dice que no. Ojo!

La "strchr" dice que devuelve un PUNTERO a la primera ocurrencia de ese valor... El caracter nulo "\0" es considerado PARTE de la cadena.
Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)

srWhiteSkull

#3
El problema que tiene es cuando captura los datos. No es recomendable pero PARA NADA mezclar tipos de datos en la misma entrada cin. Si solo quiere hacer que funcione ese código simplemente debería usar los métodos correspondientes, uno para la cadena de chars (cin.getline()) y el otro para capturar el caracter (cin.get()). También sería bueno que cogieras buenas prácticas poniendo nombres que den a entender algo o algo tan claro poner un mensaje antes del cin y así no atrofias las articulaciones de los dedos.

https://msdn.microsoft.com/en-us/library/aa277361(v=vs.60).aspx

https://msdn.microsoft.com/en-us/library/aa277360(v=vs.60).aspx

y totalmente de acuerdo, no me había fijado en ese detalle... casi mejor que sustituya además del OR por un AND el \0 por un salto de línea (\n) o use un contador hasta 100 (el espacio reservado para el array)...

Cita de: dijsktra en  4 Febrero 2018, 13:22 PM
Como mínimo, en la condición del bucle while.

while ((res == 0) || (cad[i] != '\0')) {

Cambiando el operador || (OR) por && (AND)

while ((res == 0)  && (cad[i] != '\0')  ) {

...
...

Ojo! Sería ambiguo preguntar por el caracter "\0", ya que en toda cadena de C, está, y devolvería precisamente 0, que es su valor en decimal...

Casi mejor usar funciones de C y luego cuando sepas POO comenzar a usar objetos.