Aprende a manipular strings en C con la librería string.h: leer, invertir, comparar y concatenar cadenas de forma clara y práctica. Verás cómo integrar funciones como gets, strrev, strcmp y strcat dentro de if y else para controlar la lógica con precisión.
¿Cómo iniciar con string.h y declarar arrays de chars?
Para trabajar con cadenas en C necesitas incluir stdio.h y string.h. Declara un array de tipo char con el tamaño máximo previsto; cada posición guarda un carácter. Así creas una cadena de caracteres fija, por ejemplo, de 60 posiciones.
#include<stdio.h>#include<string.h>intmain(){char string1[60];printf("Escribe una frase\n");gets(string1);// Aquí usaremos funciones de string.h más adelante.return0;}
Puntos clave:
Un array es un conjunto de celdas contiguas para almacenar datos.
En una cadena, cada celda guarda un carácter.
gets captura una línea completa y la coloca en el array destino.
printf con %s imprime un string.
¿Qué hace strrev para invertir un string?
La función strrev invierte el orden de los caracteres de una cadena. Es ideal para comprobar palíndromos como «Anita lava la tina», donde al invertir verás el mismo texto, considerando que los espacios también cuentan.
#include<stdio.h>#include<string.h>intmain(){char string1[60];printf("Escribe una frase\n");gets(string1);strrev(string1);printf("El string al revés es: %s\n", string1);return0;}
Ideas a recordar:
strrev modifica la cadena original in-place.
Los espacios y signos de puntuación también se invierten.
¿Cómo comparar y concatenar strings con strcmp y strcat?
Con strcmp comparas dos cadenas y con strcat puedes unirlas en una sola. Esto permite validar si el usuario ingresó textos idénticos y, si no lo hizo, concatenarlos en un único string.
¿Cómo funciona strcmp en la comparación?
strcmp recibe dos strings y retorna un resultado de comparación. Si te dice que son iguales, retorna 0; si son diferentes, retorna 1. Recuerda: en C la comparación distingue mayúsculas y minúsculas.
#include<stdio.h>#include<string.h>char string1[60], string2[60];intmain(){printf("Escribe una frase\n");gets(string1);printf("Escribe otra frase para comparar\n");gets(string2);if(strcmp(string1, string2)==0)printf("Ingresaste dos strings idénticos\n");elseprintf("Ingresaste dos cosas distintas\n");return0;}
Claves prácticas:
Usa el operador de comparación == para evaluar el retorno de strcmp.
Mayúsculas y minúsculas importan: "Hola" y "hola" son diferentes.
Pasa los strings como argumentos en el orden que quieres comparar.
¿Cómo unir cadenas con strcat cuando son distintas?
strcat concatena la segunda cadena al final de la primera y el resultado queda guardado en la primera. Úsalo dentro del else para construir una cadena única cuando los textos no coinciden.
#include<stdio.h>#include<string.h>char string1[60], string2[60];intmain(){printf("Escribe una frase\n");gets(string1);printf("Escribe otra frase para comparar\n");gets(string2);if(strcmp(string1, string2)==0){printf("Ingresaste dos strings idénticos\n");}else{printf("Ingresaste dos cosas distintas\n");strcat(string1, string2);printf("Si las unimos, el resultado es: %s\n", string1);}return0;}
Buenas prácticas en el flujo:
Combina if y else para decidir entre comparar o concatenar.
Recuerda que strcat no agrega espacios por sí solo; si lo necesitas, inclúyelos tú.
El primer argumento de strcat es el buffer donde quedará el resultado.
¿Tienes otras funciones de string.h que te gusten o quieres mostrar tus resultados? Cuéntalo en los comentarios y prueba tus propios códigos para reforzar lo aprendido.
Aparentemente la funcion strrev no se puede usar si usas linux. Segun lo que lei en este caso tendrias que definir tu funcion para reversar caracteres. El codigo se veria asi:
#include<stdio.h>#include<string.h>voidreverse(char[],int,int);intmain(){char string1[60];//Cadena de caracteres de 60int size;printf("Escribe una frase genial: \n");gets(string1);// Este es especifico para strings size =strlen(string1);reverse(string1,0, size -1);// string reverseprintf("El string al reves es: %s \n", string1);return0;}voidreverse(char str1[],int index,int size){char temp; temp = str1[index]; str1[index]= str1[size - index]; str1[size - index]= temp;if(index == size /2){return;}reverse(str1, index +1, size);}
Si tienes linux o el WSL en windows + librerias de C, puedes consultar la ayuda para ver más información de las funciones.
Ejemplo: man strcmp
STRCMP(3) Linux Programmer's Manual STRCMP(3)
NAME
strcmp, strncmp - compare two strings
SYNOPSIS
#include <string.h>
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
DESCRIPTION
The strcmp() function compares the two strings s1 and s2. It returns an integer less than, equal to, or greater than zero if s1 is found, respectively, to be less than, to match, or be
greater than s2.
The strncmp() function is similar, except it compares only the first (at most) n bytes of s1 and s2.
RETURN VALUE
The strcmp() and strncmp() functions return an integer less than, equal to, or greater than zero if s1 (or the first n bytes thereof) is found, respectively, to be less than, to match, or
be greater than s2.
ATTRIBUTES
For an explanation of the terms used in this section, see attributes(7).
┌────────────────────┬───────────────┬─────────┐
│Interface │ Attribute │ Value │
├────────────────────┼───────────────┼─────────┤
│strcmp(), strncmp() │ Thread safety │ MT-Safe │
└────────────────────┴───────────────┴─────────┘
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
SEE ALSO
bcmp(3), memcmp(3), strcasecmp(3), strcoll(3), string(3), strncasecmp(3), strverscmp(3), wcscmp(3), wcsncmp(3)
COLOPHON
This page is part of release 4.15 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at
https://www.kernel.org/doc/man-pages/.
Solo mencionar un pequeño aporte, si haces el prework antes de este curso o cualquier a de C, debes considerar que al abrir VSCode utilizas Ubuntu como shell y ello te dará errores cuando compiles con librerias math.h y string.h, te sugiero abrir VSCode desde el menu inicio (windows) para que funcione la extensión Compile Run y las librerias que habla el profesor Ricardo
STRING(3) Linux Programmer's Manual STRING(3)
NAME
stpcpy, strcat, strchr, strcmp, strcoll, strcpy, strcspn, strdup, strfry, strlen, strncat, strncmp, strncpy, strpbrk, strrchr, strsep, strspn, strstr, strtok,
strxfrm, - string operations
SYNOPSIS
#include <string.h>
char *stpcpy(char *dest, const char *src);
Copy a string from src to dest, returning a pointer to the end of the resulting string at dest.
char *strcat(char *dest, const char *src);
Append the string src to the string dest, returning a pointer dest.
char *strchr(const char *s, int c);
Return a pointer to the first occurrence of the character c in the string s.
int strcmp(const char *s1, const char *s2);
Compare the strings s1 with s2.
int strcoll(const char *s1, const char *s2);
Compare the strings s1 with s2 using the current locale.
char *strcpy(char *dest, const char *src);
Copy the string src to dest, returning a pointer to the start of dest.
size_t strcspn(const char *s, const char *reject);
Calculate the length of the initial segment of the string s which does not contain any of bytes in the string reject,
char *strdup(const char *s);
Return a duplicate of the string s in memory allocated using malloc(3).
char *strfry(char *string);
Randomly swap the characters in string.
size_t strlen(const char *s);
Return the length of the string s.
char *strncat(char *dest, const char *src, size_t n);
Append at most n characters from the string src to the string dest, returning a pointer to dest.
int strncmp(const char *s1, const char *s2, size_t n);
Compare at most n bytes of the strings s1 and s2.
char *strncpy(char *dest, const char *src, size_t n);
Copy at most n bytes from string src to dest, returning a pointer to the start of dest.
char *strpbrk(const char *s, const char *accept);
Return a pointer to the first occurrence in the string s of one of the bytes in the string accept.
char *strrchr(const char *s, int c);
Return a pointer to the last occurrence of the character c in the string s.
char *strsep(char **stringp, const char *delim);
Extract the initial token in stringp that is delimited by one of the bytes in delim.
size_t strspn(const char *s, const char *accept);
Calculate the length of the starting segment in the string s that consists entirely of bytes in accept.
char *strstr(const char *haystack, const char *needle);
Find the first occurrence of the substring needle in the string haystack, returning a pointer to the found substring.
char *strtok(char *s, const char *delim);
Extract tokens from the string s that are delimited by one of the bytes in delim.
size_t strxfrm(char *dest, const char *src, size_t n);
Transforms src to the current locale and copies the first n characters to dest.
DESCRIPTION
The string functions perform operations on null-terminated strings. See the individual man pages for descriptions of each function.
SEE ALSO
index(3), rindex(3), stpcpy(3), strcasecmp(3), strcat(3), strchr(3), strcmp(3), strcoll(3), strcpy(3), strcspn(3), strdup(3), strfry(3), strlen(3), strncasecmp(3), strncat(3), strncmp(3),
strncpy(3), strpbrk(3), strrchr(3), strsep(3), strspn(3), strstr(3), strtok(3), strxfrm(3)
COLOPHON
This page is part of release 4.15 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at
https://www.kernel.org/doc/man-pages/.
2014-01-04 STRING(3)
hay alguna manera de colocar una palabra y que la reconozca sin importar como la escriba? por ejemplo si la escribe con mayusculas, minusculas o entre mayusculas y minusculas la reconozca?
gets puede porvocar buffer overflow osea puede sobrescribir un dato encima de otro. El compilador no da error pero es peligroso cuando lo de o cuando se trabaja con mayores datos o proyectos.
De notar que el profesor dio 6 caracteres como espacio fijo en nuestros array, 5 para la stringa y un 0 para el final, el cero siempre ocupara el ultimo lugar de una array en fomato char, por eso hay que saber el rango de espacio de caracteres que se quiera ingresar. Pero escribio mas de 5 caracteres en la consola y no nos dio error aunque si deberia darlo ps nuestro espacio era solo de 5 caracteres mas el 0. Por eso el gets() es peligroso y obsoleto, porque no nos da la certeza si estamos esscribiendo un buen codigo.
Buensimo el algoritmo, doy mi aporte explicandolo:
Con el if, verificamos si hay una string.
Con int i = strlen(str) - 1, lo que hacemos es posicionar a la variable I en el final de la string, supongamos que nuestra string mide 8 posiciones, entonces, nosotros posicionamos a I en la 8octva, si mide 15, la posicionamos en la 15 posicion. Esto hara que I tome los caracteres mas grandes, y J los mas pequenios y al pasar por el bucle, iremos reemplazando los caracteres de I por J. Asi hasta que el bucle se rompa. Es decir, hasta que I sea menor que J.
Hola, alguien sabe como funciona strcat, me causa duda el hecho de que no le pasaras el apuntador de la variable string 1 y aún así fue capaz de guardar en la misma dirección. :-O
strcat, al igual que las funciones de strxxx y wcsxxx de las librerías <string.h> y <wchar.h>, respectivamente, toman como parámetro valores de tipo string, por lo tanto cuando llamas la función strcat(string1, string2) lo que sucede es que hace una "suma" de strings dándote como resultado la unión de las mismas, el primer parámetro de strcat es el destino donde se guardará el nuevo valor concatenado, y el segundo parámetro es la fuente a concatenar.
Es como hacer esta operación:
int a, b, resultado;
a = 1;
b = 2;
resultado = a + b; // resultado = 3
strcat hace exactamente lo mismo que la variable resultado, toma 2 valores como argumento, los une en uno solo y sobreescribe el resultado en el primer parámetro, que en este caso es string1, con la diferencia de que en operaciones matemáticas el resultado de cualquier operación solamente se sobreescribe en la variable final y no modifica los parámetros de entrada iniciales.
Hola lo puedes hacer de la siguiente forma:
Defines otro array donde vas a guardar el caracter espacio.
Concatenas el string1 con el array que tiene el espacio.
Concatenas el string1 con el string 2.
Anexo el código
#include <stdio.h>#include <string.h>char string1[60];char string2[60];char space[1]=" ";int main(){printf("Escribe una frase: \n");gets(string1);printf("Escribe otra frase para comparar: \n");gets(string2);if(strcmp(string1, string2)==0){printf("ingresaste dos strings idénticos\n");}else{strcat(string1, space);strcat(string1, string2);printf("Ingresaste dos cosas distintas, si las unimos, el resultado es: %s\n", string1);}return0;}```
strrev no está presente en el compilador GCC que regularmente se instala en linux. Puedes usar la siguiente implementación:
La variable size del tipo size_t es para que no haya problemas con que el usuario ingrese un texto más largo del definido.
Comprueba para que sirve la línea string1[strlen(string1)-1] = '\0' comentándola y viendo la diferencia de cuando no está 😀
gets no debería usarse, NUNCA. Pueden usar fgets, que es completamente seguro.
Por otro lado, también hay 2 bibliotecas importantes que son útiles para el manejo de cadenas de texto:
<wchar.h>
<stddef.h>
Si se han dado cuenta, al imprimir carácteres fuera del rango ASCII estándar (como la ñ y vocales acentuadas), con %s y%ls se ve el texto sin problema (asumiendo que el escaneo de entrada fue con eso mismo o con fgets) pero si intentan imprimir el carácter individualmente con %c, les arrojará mojibake. Para imprimir carácteres especiales hacen uso de cualquiera de estas 2 bibliotecas, configuran el locale y ya podrán mostrar estos carácteres uno por uno correctamente con %lc
Y para finalizar, si la consola se atasca, pueden usar freopen() para cambiar el flujo del stream ya que cada vez que se imprime o se lee texto wide con wprintf/wscanf este flujo es modificado y no vuelve automáticamente “a la normalidad”. A menos que usen un solo tipo de texto (char o widechar) a lo largo de todo el código, esto será necesario para desatascar la lectura y escritura de datos si mezclan chars con widechars.
Por ejemplo:
#include <stdio.h>#include <wchar.h>#include <locale.h>#include <string.h>int main(){setlocale(LC_ALL,""); char mitexto[64]; wchar_t mitexto_w[128];printf("Este es una entrada de texto estándar:\n> ");scanf("%s",&mitexto);freopen(NULL,"r", stdin);freopen(NULL,"w", stdout);wprintf(L"Este es una entrada de texto widestring:\n> ");wscanf(L"%ls",&mitexto_w);freopen(NULL,"w", stdout);putchar('S');printf("\nEste es una salida de texto estándar: '%s'\n", mitexto);for(int i =0; i <=strlen(mitexto); i++)printf("%i-%c\n", mitexto[i], mitexto[i]);freopen(NULL,"w", stdout);putwchar('W');wprintf(L"\nEste es una salida de texto widestring: '%ls'\n", mitexto_w);for(int i =0; i <=wcslen(mitexto_w); i++)wprintf(L"%i-%lc\n", mitexto_w[i], mitexto_w[i]);return0;}
Nota: La L es un prefijo necesario para indicar que se trata de un texto longstring o widechar, este prefijo no se usa con fgetws o scanf, pero con wscanf y wprintf sí.
Hola, por favor su apoyo y sugerencias. Requiero de un código que tenga como entrada un string y seleccione e imprima las vocales y consonantes en dos lineas diferentes. es decir, si el string de entrada es: felipe debería imprimir:
- vocales: eie
consonantes: flp
Les comparto mi actual código el problema es que imprime el texto “vocales” de forma repetitiva al igual que “consonantes”. No se como solicionarlo.
De antemano gracias por sus aportes.
#include<stdio.h>#include<string.h>int main(){char SS[50];scanf("%s",SS);for(int i =0; i<=strlen(SS); i++){if(SS[i]=='a'||SS[i]=='e'||SS[i]=='i'||SS[i]=='o'||SS[i]=='u'){printf("vocales: %c\n",SS[i]);}}for(int i =0; i<strlen(SS); i++){if(SS[i]!='a'&&SS[i]!='e'&&SS[i]!='i'&&SS[i]!='o'&&SS[i]!='u'){printf("consonantes %c\n",SS[i]);}}}