Me funcionó usando const char en lugar de char. alguien sabe por qué?
Curso de vim por mauro yo digo
Seria increible que lo hiciera la verdad
La verdad si estaria bueno...
Hay una particularidad en las cadenas de caracteres, que siempre debes contar el carácter ‘\0’ al final de una cadena por ejemplo :
Si usamos una cadena de 4 caracteres como es el caso para:
char cadena[4] = {‘H’,‘O’,‘L’,‘A’}
nos muestra el signo de interrogación, esto sucede porque debemos tener en cuenta el carácter ‘\0’ también, es decir debe ser así de la siguiente manera:
char cadena[5] = {‘H’,‘O’,‘L’,‘A’,’\0’}
es por esta razón que el profesor utilizo su nombre de 19 caracteres sin contar el ‘\0’ y es por eso que le muestra el signo de interrogación y el profesor al aumentar el número de caracteres del array a 20 soluciona el problema.
Excelente aporte, gracias por compartir!!!
Otra libreria que maneja los caracteres y string es la <ctype.h>
EJEMPLOS:
<#include <stdio.h>#include <string.h>#include <ctype.h>int main(){//EJERCICIO 1 //MUESTRA SI LAS VARIABLE SON ALFANUMERICAS O NO int v1='t'; int v2='2'; int v3='\t'; int v4=' ';if(isalnum(v1)){//funcion que se encarga de evaluar si es un caracter o noprintf("v1 = %c y es alfanumerico \n", v1);}else{printf("v1 = %c y no es alfanumerico \n", v1);}if(isalnum(v2)){//funcion que se encarga de evaluar si es un caracter o noprintf("v2 = %c y es alfanumerico \n", v2);}else{printf("v2 = %c y no es alfanumerico \n", v2);}if(isalnum(v3)){//funcion que se encarga de evaluar si es un caracter o noprintf("v3 = %c y es alfanumerico \n", v3);}else{printf("v3 = %c y no es alfanumerico \n", v3);}if(isalnum(v4)){//funcion que se encarga de evaluar si es un caracter o noprintf("v4 = %c y es alfanumerico \n", v4);}else{printf("v4 = %c y no es alfanumerico\n ", v4);}//EJERCICIO 2 //isalpha (Intente hacerlo a traves de datos por teclado y no funciona) int v1=2;if(isalpha(v1)){//Determina si una el caracter es alfbetico o no printf("El caracter es alfabetico", v1);}else{printf("No se ingreso una letra del alfabeto");}}>
Por que el profesor dijo que el \0 se usa para evitar el signo de interrogacion, pero luego solo aumento el tamaño del array y funciono de igual manera?
Hay una particularidad en las cadenas de caracteres, que siempre debes contar el carácter '\0' al final de una cadena por ejemplo :
Si usamos una cadena de 4 caracteres como es el caso para:
char cadena[4] = {'H','O','L','A'}
nos muestra el signo de interrogación, esto sucede porque debemos tener en cuenta el carácter '\0' también, es decir debe ser así de la siguiente manera:
char cadena[5] = {'H','O','L','A','\0'}
es por esta razón que el profesor utilizo su nombre de 19 caracteres sin contar el '\0' y es por eso que le muestra el signo de interrogación y el profesor al aumentar el número de caracteres del array a 20 soluciona el problema.
Existe una diferencia entre no poner el caracter nulo al final de tu arreglo
Y es que C no va a tomar tu arreglo como una cadena, sino le pones al final ese caracter nulo
Solo es un arreglo de caracteres, como un arreglo de enteros si lo quieres ver de esa manera.
Entonces para que C lo interprete como una cadena, se ocupa agregar ese ultimo caracter nulo
Espero te sea de ayuda, buen dia
¿Cuál es la verdadera diferencia entre
char * str ="Mauro";
,
char str ="mauro"
y
char str[]="mauro"
? Si al final el programa funciona con cualquiera de las tres.
char * str = "Mauro" se define un arreglo de string y es otra manera de decir char str[] = "Mauro"
Diferente a char str = "Mauro" el que aunque define una variable char y escribe una palabra solamente es una variable y no un arreglo o vector la lectura en memoria sera diferente...
Son solo distintas manera de declarar un string. Por ejemplo cuando se utilizan los corchetes se usa frecuentemente cuando queremos que haya un limite en el texto, como en twitter y los 140 caracteres
**strcmp(): **Es una funcion que sirve para comprar el valor o longitud de dos cadenas de texto, utilizando la bibloteca string.h, el valor que retorna o devuelve es entero, su declaracion es la siguiente:
-->Los valores que devolvera seran respecto a como estara estructurada las cadenas es decir, si los textos son iguales incluyendo mayusculas y miniculas, por que es sensible a este tipo de caracteres, devolvera 0.
--> Cuando la primera cadena es mayor que la segunda devuelve un un valor en positivo. Cuando la segunda cadena es mayor a la primera devuelve un valor negativo.
IMPORTANTE En algunos casos el compliador que comprara las dos cadenas con mayusculas minisculas opmite esto, aunque sin embargo es una buena practica tenerlo en cuenta
Evaluar las cadenas con strcmp: Para ello tenemos que hacer las condiciones, de si son iguales o en caso de que sean distintas para completar la funcion, para ello hacemos lo siguiente:
<*==+0--> en caso de que sean iguales ?"mensaje a imprimir",sino:*:"distintos");>
\0: Este es un carácter mas, por lo tanto, cuando se haga el calculo de cuanto pesa un string, hay que tener en cuenta \0, lo que quiere decir que al momento de trabajar con string siempre tenemos que tenerlo en cuenta en caso de tener una cadena de texto de 10 caracteres, tenemos que siempre sumar +1 por \0
--> Con esto lo que estamos haciendo es asignar una variable de tipo puntero de caracteres, asignarle los caracteres, y luego crear otra variable de tipo char con un array y le asignamos una cadena de texto.
--> utilizando la funcion strcpy, estamos cambiando la cadena de texto del primer parametro a la del segundo, por ende vemos que primero se coloca la variable que se va a cambiar y luego la que la va a sustituir, luego imprimimos su valor en caracteres y su valor sera igual a variable de puntero.
El manejo de las cadenas pareciera que es algo enredado en la practica
gracias a estas clase se puede entender de una manera mas facil.
[min 2.53] ¿Por qué el profe utiliza un entero largo (%ld) y no uno "normal" (%d)?
Pues yo creo que no hay ninguna razón en especial, trata de usar d a ver si obtienes el mismo resultado. La diferencia entre uno y el otro es que el long puede abarcar más información en decimales.
Saludos!
Por que en el minuto 06:15 solo aumenta el tamaño del arreglo pero no añade el caracter nulo /0 al final solo lo deja asi:
char name[20]="Mauro Uriel Chojrin";printf("Mi nombre es %s\n", name);
Y le funciona, es decir no le imprime el signo de interrogacion al final.
El compilador autocompleta el caracter nulo o que es lo que sucede?
Por que ese carácter el compilador ya esta reservado en memoria.
Es decir, "Hola" a simple vista tiene 4caracteres, sin embargo, el compilador agrega en automático el cierre de cadena \0.
Así que, a la hora de compilar, se le agrega el cierra de string, "Hola\0". Ya no tienes solo 4 espacios, sino que son 5.
Es por ello que debes tener en cuenta que, si usas string, debes reservar 1 espacio para el cierre de cadena \0
Cual es el uso de .h, luego del nombre de la libreria en C?
El .h denota que son fichero header(cabecera), estos ficheros traen las definiciones de las funciones que estas incluyendo para que el compilador tenga constancia de que sí están definidos.
vale muchas gracias por tu respuesta!
¿Por qué escribimos int main() cuando las variable que declaramos con su tipo de dato es char?
El tipo de función depende de la variable o valor que retorne, no de las variables que se definen y usen en ella.
En la función main se suele retornar 0, que es un entero, por eso es int main().
Muchísimas gracias @ceporro porque aclarme la duda!
¿Por qué siempre debemos escribir return 0?
La función main generalmente debe retornar un valor para terminar su ejecución. El return 0 quiere decir que terminó el proceso satisfactoriamente y cualquier otro return es que hubo un fallo en la ejecución. Aunque se puede ejecutar bien sin el return al final.
Comparto un enlace de referencia hablando sobre esto.
Hola, como ya te dijeron, el return 0 indica que el programa termino satisfactoriamente, y al ser una función entonces está bien que retorne algo, y si te das cuenta, al declarar la función main la declaramos como int, ese int está indicando que la función main debe devolver algo, y no cualquier cosa, debe devolver un entero, es por eso que ponermos return 0, para indicar que todo salió bien y que la función acabó ^^
¿Por qué cambia de 'char *otherName' a 'char dst[]' al momento de utilizar la función strcpy? ¿Cuál es la limitante de la función?
Porque la variable char *otherName crea un string literal que se guarda como read-only, entonces al quere modificarla causaría un error.
¡Gracias, crack!
También hay 3 bibliotecas que son útiles para el manejo de cadenas de texto:
<wchar.h> //provee la variable tipo wchar_t
<stddef.h> //también provee wchar_t, entre otras cosas
<locale.h> //requerido para mostrar texto Unicode
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í.