Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, pessoal,
eu estou tentando criar um loop "for" que leia uma string e imprima na tela, a cada loop, o caractere da posição "i" da lida no loop (veja o código).
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
char string[99];
char *pst = &string[99];
printf("String:\t");
scanf("%[^\n]s",&string[99]);
for(i = 0; pst[i]!='\0'; i++);
printf("%d",i);
return(0);
}
O código funciona, mas tem uma variável estourando que não consigo encontrar. A mensagem de erro é:
String: "string digitada"
17 stack smashing detected : /home/camatue/Sistemas/workspace/project_scoop/Debug/project_scoop terminated
Eu gostaria muito de tirar a roda desse buraco.
Puxa!! Na ignorância da linguagem C, eu fiz combinações desses detalhes. Mas foi mais instrutivo perguntar.
Valeu cara!
Cara! Me precipitei. Entrada:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
char string[99];
char *pst = &string[99];
printf("String:\t");
scanf("%[^\n]s",string);
for(i = 0; pst[i]!='\0'; i++);
printf("%d",i);
return(0);
}14:54:07 ** Incremental Build of configuration Debug for project project_scoop **
make all
Building file: ../src/project_scoop.c
Invoking: Cross GCC Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/project_scoop.d"
-MT"src/project_scoop.d" -o "src/project_scoop.o" "../src/project_scoop.c"
Finished building: ../src/project_scoop.c
Building target: project_scoop
Invoking: Cross GCC Linker
gcc -o "project_scoop" ./src/project_scoop.o
Finished building target: project_scoop
14:54:07 **** Build Finished (took 110ms)
Execução:
String: string digitada
0
Tá valendo
Não era para dar zero, né?
Fiz
char *pst = &string[0];
e deu certo
Valeu
Vou te mostrar os erros que tem no seu código, mas peço que façassa!
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
char string[99];
char *pst = &string[99]; // Aqui vc está fazendo o ponteiro apontar para uma posição que não existe (a ultima posição é 98)
printf("String:\t");
scanf("%[^\n]s",string);
for(i = 0; pst[i]!='\0'; i++); // voce colocou um "ponto e virgula" no FOR, tire-o daí. o FOR nem ta rodando
printf("%d",i); // Você está exibindo o valor de i ....
return(0);
}
Vc colocou um ponto e virgula no final do for, então o I valor 0
TalissonBento,
muito obrigado pela atenção, é como uma carona para outra cidade quando estou indo a pé.
Mas o for não leva ponto e vírgula nem quando não tem bloco de código??
E eu não especifiquei, mas o for dá o comprimento da string digitada no valor de i...
Obrigado
Se quiser pegar o comprimento da string utilize .size()
string nome = "talisson";
cout << nome.size(); // 8
Quando o FOR é utilizado sem chave ele apenas reconhece a primeira linha depois de sua declaração como seu escopo;
Assim também acontece com o IF e WHILE
Exemplo
for(int i=0, i<10;++i)
cout << "Estou exibindo: " << i << endl;
cout<<"Acabei de sair do FOR e vou fazer outra coisa..."<<endl;
Olá, olhe bem sua declaração do vetor
char string[99];
Logo em seguida você tenta fazer o ponteiro apontar para a última posição deste vetor
char *pst = &string[99];
Quando você o declarou com a capacidade 99 e logo em seguida tentou acessar o último elemento usando este valor de capacidade que é "99", pois bem, como você tem um vetor de capacidade 99 sua última posição é 98, porque para acessar elementos de vetor se começa contando do 0 (que seria o primeiro elemento).
no seu scanf
scanf("%[^\n]s",&string[99]);
//poderia ter feito assim:
scanf("%[^\n]s", string);
//o só "string" é poque o vetor sempre aponta para o primeiro endereço de memoria, sendo possivel você somar string + 2 que você pegaria o terceiro elemento. seria como 0x0F0 (Endereço do primeiro elemento) + 2 = 0x0F2 vualá!!!
você esta tentando jogar o que foi digitado a partir da posicão 99? sendo que vai até 98.