I suggest that you always use fgets
, as this is something you are already using, and ensures that your program is never susceptible to Buffer overflows .
Even when you have to read an integer as in opcao
, you can still read the content as a string to a temporary buffer of a size you define, and interpret your integer either with sscanf
or even atoi
:
char buff[20];
fgets(buff, 20, stdin);
sscanf(buff, "%d", &escolha);
Note that sscanf
functions as scanf
but starting with a string instead of the input stream.
Using fgets
and sscanf
, your program looks like this:
char s1[20];
char s2[20];
char buff[20]; //buffer de leituras
int escolha = 1;
printf("*****************************\n");
printf("*Menu de opções para strings*\n");
printf("*****************************\n\n");
printf("Primeiro informe seu nome por favor: ");
fgets(s1,20,stdin);
s1[strlen(s1)-1] = 'void lerString(char *stringLida){
fgets(stringLida, 20, stdin);
stringLida[strlen(stringLida)-1] = 'lerString(s1);
';
}
'; //remover o \n que ficou da leitura com fgets
do {
printf("\n(1) Quer saber o tamanho de seu nome?\n");
printf("(2) Que tal comparar seu nome com outro nome?\n");
printf("(3) Quer unir seu nome com outro nome?\n");
printf("(4) O que acha de seu nome invertido?\n");
printf("(5) Quer saber quantas vezes a mesma letra aparece em seu nome?\n");
fgets(buff, 20, stdin); //agora fgets
sscanf(buff, "%d", &escolha); //leitura do numero com sscanf
system("cls");
switch(escolha) {
case 1:
printf("A quantidade de caracters de seu nome é: %d", strlen(s1));
break;
case 2:
printf("Digite um novo nome para comparar: ");
fgets(s2, 20, stdin);
s2[strlen(s2)-1] = 'char buff[20];
fgets(buff, 20, stdin);
sscanf(buff, "%d", &escolha);
'; //remover o \n também
break;
default:
printf("Opção inválida");
}
} while(escolha);
You may want to abstract the read logic for a function in order to simplify its various uses:
char s1[20];
char s2[20];
char buff[20]; //buffer de leituras
int escolha = 1;
printf("*****************************\n");
printf("*Menu de opções para strings*\n");
printf("*****************************\n\n");
printf("Primeiro informe seu nome por favor: ");
fgets(s1,20,stdin);
s1[strlen(s1)-1] = 'void lerString(char *stringLida){
fgets(stringLida, 20, stdin);
stringLida[strlen(stringLida)-1] = 'lerString(s1);
';
}
'; //remover o \n que ficou da leitura com fgets
do {
printf("\n(1) Quer saber o tamanho de seu nome?\n");
printf("(2) Que tal comparar seu nome com outro nome?\n");
printf("(3) Quer unir seu nome com outro nome?\n");
printf("(4) O que acha de seu nome invertido?\n");
printf("(5) Quer saber quantas vezes a mesma letra aparece em seu nome?\n");
fgets(buff, 20, stdin); //agora fgets
sscanf(buff, "%d", &escolha); //leitura do numero com sscanf
system("cls");
switch(escolha) {
case 1:
printf("A quantidade de caracters de seu nome é: %d", strlen(s1));
break;
case 2:
printf("Digite um novo nome para comparar: ");
fgets(s2, 20, stdin);
s2[strlen(s2)-1] = '%pre%'; //remover o \n também
break;
default:
printf("Opção inválida");
}
} while(escolha);
What would you use like this:
%pre%
See the code working on Ideone