Astackr con encontrar caracteres dentro de una cadena en lenguaje C

#include  #include  main() { int i; int *b, *z; char name[30]; char vowel[5] = {'A', 'E', 'I', 'O', 'U'}; char consonants[23] = {'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Y','Z'}; printf ("input the string: "); scanf ("%s", name); printf ("The string is %s\n", name); for (i=0; name[i]!='\0'; i++){ if (b=strchr(vowel, name[i]) != NULL) { printf ("The vowels are: %s\n", b); } else if (z=strchr(consonants, name[i]) != NULL) { printf ("The consonants are: %s\n", z); } } } 

Estoy tratando de encontrar cuántas vocales y consonantes en la matriz. Ese es el único algoritmo que nuestro profesor nos mostró, pero no funciona. ¿Alguien me puede señalar mis errores?

Acabo de hacer un bash más, con todos sus consejos,

 #include  #include  int main() { int vow, cons, i; char *s, *s1; char name[30]; char vowel[6] = "AEIOU"; char consonants[21] = "BCDFGHJKLMNPQRSTVWXYZ"; printf ("input the string: "); scanf ("%s", name); printf ("The string is %s\n", name); for (i=0; name[i]!='\0'; i++) s = strchr(vowel, name[i]); printf ("The vowels are: %s\n", s); s1 =strchr(consonants, name[i])) { printf ("The consonants are: %s\n", s1); } return 0; } 

Así es como lo cambié, con todos sus consejos, ¿cuáles son mis otros problemas? causa aún no funciona bien. Gracias.

Y esta es mi otra versión del progtwig.

  #include  #include  int main() { int i; int counter=0, counter2=0; char *s; char name[30]; char vowel[6] = "AEIOU"; char consonants[21] = "BCDFGHJKLMNPQRSTVWXYZ"; printf ("input the string: "); scanf ("%s", name); printf ("The string is %s\n", name); for (i=0; name[i]!='\0'; i++) { if (s = strchr(vowel, name[i])) { counter++; } else if (s =strchr(consonants, name[i])) { counter2++; } printf ("First counter is %d\n", counter); printf ("The second counter is %d\n", counter2); return 0; } } 

Agregué contadores para contar la cantidad de vocales y consonantes, todavía no funciona.

strchr() es para buscar en cadenas.

 char vowel[] = "AEIOU"; char consonants[] = "BCDFGHJKLMNPQRSTVWXYZ"; 
 #include< stdio.h> int main() { int vowel=0,consonant=0; printf ("input the string: "); scanf ("%s", name); printf ("The string is %s\n", name); for(int i=0;name[i] !='\0';i++) { if( name[i] == 'A' || name[i] == 'E' || name[i] == 'I' || name[i] == 'O' || name[i] == 'U' ) { vowel++; } else consanant++; } printf("%d %d",vowel,consonant); return 0; } 

Cuando compilo esto, recibo los siguientes mensajes:

 $ gcc -Wall vc.c vc.c:4:1: warning: return type defaults to 'int' [-Wreturn-type] vc.c: In function 'main': vc.c:17:8: warning: assignment makes pointer from integer without a cast [enabled by default] vc.c:17:3: warning: suggest parentheses around assignment used as truth value [-Wparentheses] vc.c:18:4: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int *' [-Wformat] vc.c:20:13: warning: assignment makes pointer from integer without a cast [enabled by default] vc.c:20:3: warning: suggest parentheses around assignment used as truth value [-Wparentheses] vc.c:21:4: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int *' [-Wformat] vc.c:24:1: warning: control reaches end of non-void function [-Wreturn-type] 

Entonces, comience por asegurarse de que su tipo de retorno para main sea ‘int’

 int main(){ 

y añadiendo un retorno en la parte inferior de la función.

 return 0; 

A partir de entonces, establezca b y z como char * s, de modo que coincidan con el tipo de retorno de strchr

 char *b, *z; 

Esto eliminará todas las advertencias.

 $ gcc -Wall vc.c $ 

Excelente. Ahora, cuando ejecutamos tu progtwig:

 $ ./a.out input the string: aaa The string is aaa Segmentation fault 

“Fallo de segmentación” significa que se está ejecutando el final de una matriz y la memoria de lectura que no posee. Ahora implementa la solución de Ignacio Vázquez-Abrams.

 char vowel[] = "AEIOU"; char consonants[] = "BCDFGHJKLMNPQRSTVWXYZ"; 

Ahora su progtwig se ejecutará hasta su finalización.

 $ ./a.out input the string: AAA The string is AAA The vowels are: AEIOU The vowels are: AEIOU The vowels are: AEIOU 

Pero no hace mucho, ¿verdad?

Entonces, si solo estás tratando de contar cuántas vocales y consonantes hay, puedes agregar un número entero para cada incremento que se incremente cada vez que se encuentre el tipo correcto y mostrarlo al final:

 printf("Vowels:\t%d\nConsonants:\t%d", vowelsFound, consonantsFound); 

Sin embargo, si está intentando generarlas como listas, tendrá que manipular muchos más datos. Algunos enlaces a revisar:

Página de manual de Linux para printf

Página de manual de Linux para funciones de cadena

Ha colocado la statement de return dentro del bucle for que le impide escanear toda la matriz de name .

Cuando use strchr , también necesitará convertir el carácter de bucle actual en mayúsculas para que coincida correctamente ya que ha definido las vowels en mayúsculas. Para usar toupper() necesitas incluir ctype.h .

Tampoco es necesario definir consonants . Lo que no es una vocal es una consonante.

Aquí está el código. Lo he probado y funciona:

 #include  #include  #include  int main() { int i; int counter=0, counter2=0; char *s; char name[30]; char vowel[6] = "AEIOU"; printf ("input the string: "); scanf ("%s", name); printf ("The string is %s\n", name); for (i=0; name[i]!='\0'; i++) { if (strchr(vowel, toupper(name[i])) != NULL) { counter++; } else { counter2++; } } printf ("First counter is %d\n", counter); printf ("The second counter is %d\n", counter2); return 0; } 

Alternativamente.

 #include  #include  int main() { int t [256]; int i,c; int cntw = 0; int cntc = 0; const char * vowel="AEIOUaeiou"; const char * consonants="BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz"; memset(t,0,256); while (*vowel) { t[*vowel] = 1; ++vowel;} while (*consonants) { t[*consonants] = 2; ++consonants;} printf ("Input the text: CTRL-D to end\n"); c = getchar(); while(c >=0) { switch(t[c]) { case 1: ++cntw; break; case 2: ++cntc; break; } c=getchar(); } printf ("Text has %d vowel%s and %d consonant%s\n", cntw,(cntw>1)?"s":"", cntc,(cntc>1)?"s":""); return 0; }