Primero decir que C no es mi fuerte, ya que programo más en C++ pero te comento:
- Por lo que he leído ahora mismo por ahí, las funciones de entrada de datos que usas son para especificar el tamaño máximo de la entrada, cosa que no haces. Por ejemplo <gets_s> debería recibir la variable donde quieres guardas el dato y el tamaño máximo. En ese caso te recomiendo usar <fgets> y sería tan simple como <fgets(cadena1, 10, stdin);> es decir guardar en cadena1 los 10 primeros caracteres cogidos de la entrada estándar.
- Segundo... Pero este trozo de código que sentido tiene??
if(cadena1[11]>10){
printf("no puede exceder 10 cartacteres, de nuevamente el nombre"); }
else{
while(cadena1[11]>10);
{
// mas codigo
}
Traduzco por si las moscas: si el caracter guardado en cadena1[11] es mayor que 10 (supongo que comparará en Ascii lo que tampoco tiene mucho sentido creo yo), mostramos por pantalla que no se puede exceder de 10 caracteres; sino (osea si cadena1[11] no es mayor que 10) mientras cadena1[11] sea mayor que 10 que haga el resto del código... Te das cuenta que es un sin sentido?
PD: El while va sin ";". El do while sí va con ";". Aunque siga estando mal para futuros programas.
- Tercero: no repitas código (lo que se conoce como principio de una única vez). Si en ambos casos del switch acabas haciendo lo mismo, hazlo una vez hayas salido del switch y así sólo lo pones una vez.
- Cuarto: quieres repetir el programa? Aquí tienes un ejemplo para que lo adaptes.
char respuesta;
do{
// codigo, mucho codigo
printf("Desea repetir el programa (s/n): "; } while(respuesta == 's' || respuesta == 'S');
PD: Los caracteres entre comillas simples, las cadenas de caracteres entre comillas dobles.
Edit: He estado probando a ver cómo podría hacer el programa y aunque he conseguido avanzar algo, no consigo que quede del todo correcto. El código que he implementado es el siguiente: #include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int SIZE_NAME = 10;
const int SIZE_EMAIL = 30;
typedef enum{true = 1, false = 0} bool;
int main(){
char name[SIZE_NAME+1];
char hotmail[] = "@hotmail.com";
char gmail[] = "@gmail.com";
char finalEmail[SIZE_EMAIL];
int option;
char repeat;
bool validEmail;
do{
validEmail = true;
//do{ // bucle para quitar los saltos de linea del buffer || getchar() del ultimo while
printf("Enter your name for the email: "); fgets(name
, SIZE_NAME
, stdin
); //} while(name[0] == '\n');
fscanf(stdin
, "%d", &option
); // opcion 1 para guardar opcion //scanf("%d", &option); // opcion 2 para guardar opcion
//printf("%s", finalEmail); // prueba
//printf("%s", name); // prueba
// esta funcion inserta la respuesta anterior antes de la nueva. Descomentar pruebas para verlo
//printf("%s", finalEmail); // prueba
switch(option){
case 1:
break;
case 2:
break;
default:
printf("\nThis option is invalid\n"); validEmail = false;
break;
}
if(validEmail){ // no se puede repetir programa si validEmail == false por errores en el buffer
printf("\nYour email is: %s\n", finalEmail
); printf("\nDo you want to repeat the program (y/n): "); do{ // bucle para evitar que el salto de linea del buffer nos impida elegir si repetir programa
} while(repeat == '\n');
}
} while(validEmail
&& (repeat
== 'y' || repeat
== 'Y') && getchar()); // getchar() para eliminar un '\n' del buffer || do while inicial }
Lo que no consigo arreglar es que si introduces un correo y deseas escribir otro, si el segundo nombre es más corto que el primero se repite el primer nombre. Además si el segundo nombre no es más corto se añade el correo anterior y se concatena la nueva opción. Os pongo un ejemplo para que veáis a lo que me refiero:
nombre1: aaaaaa
opcion1: 1
email1: "
aaaaaa@hotmail.com"
Hasta aquí todo bien pero ahora introducimos "y" para crear otro correo:
nombre2: bb
opcion2: 2
email2: "bbaaaa@hotmail.com@gmail.com"
No sé muy bien como solucionar esto. Si alguien puede echar un vistazo al código anterior y corregirme si me he equivocado en algo...
Dentro del propio código hay algunos comentarios sobre el porqué de algunas partes del código (he averiguado la línea en la que sucede ese error que he explicado antes y está señalado en el código).
Y por último me gustaría que el código quedase bien, es decir, si se pudiese arreglar el código sin añadir un montón de cálculos incomprensibles (no sé si me explico).
PD: Por este tipo de cosas me quedo con C++. Pero me gustaría conseguir resolver este programa