Jump to content
deadvi

Segmentation Fault em função que manipula strings apontadas

Recommended Posts

deadvi

Boas pessoal,

eu sou novo aqui por isso perdoem-me por erros de iniciante.

O meu problema é o seguinte. Tenho de fazer uma função que procura numa string espaços, substitui por hífens e devolve o número de substituições efectuadas. O que tenho até agora é isto mas ao executar dá-me segmentation fault:

int subesp (char *s)
{
char aux;
int subs = 0;
while (*s != '\0')
{
	if (*s == ' ')
	{
		aux = '-';
		*s = aux;
		subs++;
		s++;
	}
	else
	{
		s++;
	}

}
printf("%s", s);
return subs;
}

int main()
{
char *s = NULL;
printf("Introduza string:\n");
scanf("%s", s);
subesp(s);
return 1;
}

Podem-me explicar o porquê de estar mal?

Obrigado desde já,

Cumps,

Deadvi

Share this post


Link to post
Share on other sites
Baderous

Compilando isso com a flag -g para gerar símbolos para debug, e correndo depois o executável com o GDB, obtém-se a seguinte informação acerca do erro:

Program received signal EXC_BAD_ACCESS, Could not access memory.

Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000

0x00007fff8004d254 in __svfscanf_l ()

Vê como estás a declarar a string.

Share this post


Link to post
Share on other sites
deadvi

Ups. Obrigado. Não sabia isso da flag ao compilar. Quando ao resto está tudo certo?

Um off-topic:

As cores no código dão para pôr automaticamente ou tem de ser manualmente?

Share this post


Link to post
Share on other sites
Localhost
As cores no código dão para pôr automaticamente ou tem de ser manualmente?

[ code = C ] código aqui [ /code ], sem os espaços.


here since 2009

Share this post


Link to post
Share on other sites
Baderous

Ups. Obrigado. Não sabia isso da flag ao compilar. Quando ao resto está tudo certo?

Não, tens algumas coisas a corrigir.

1) O scanf, quando usado com as strings de formato simples para strings (%s), só lê até ao 1º caracter branco, sendo o <espaço> um desses caracteres. Por isso ao tentares ler uma string com espaços, ele só vai guardar o que leu até ao 1º, tudo o resto dispensa. Para leres strings com espaços tens de dar uma formatação especial, como esta:

scanf("%[^\n]",s);

Assim, ele lê tudo até encontrar um \n. De preferência deve-se indicar o nº de caracteres máximos a ler para não gerar buffer overflow, desta forma:

scanf("%100[^\n]",s); //máximo de 100 chars

2) Na tua função subesp tens coisas desnecessárias como o aux que não está lá a fazer nada e o incremento do apontador que pode ser feito fora do if/else.

3) Estás a percorrer a string usando o apontador que recebes como argumento e que, inicialmente, aponta para o 1º elemento da mesma. Ao percorreres a string até ao fim, no final, o apontador está a apontar para o último elemento ('\0'), de modo que o printf não vai imprimir nada. Tens de usar um apontador auxiliar e usar esse para percorrer a string. O printf pode ficar igual, porque irá imprimir a string apontada por s, mas para percorrer não uses o s.

4) A main retorna sempre 0 e não 1.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.