Pular para o conteúdo

Função strlen (problema)

Responder tópico
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
  • Denunciar
  • Indicar
01 02

1. Função strlen (problema)

Enviado em 29/11/2005 - 11:50h

Olá pessoal, sou novo aqui no fórum e estou com um problema. Preciso usar a função "strlen" da biblioteca "string.h", porém ela não está retornando o número exato de caracteres de uma palavra, se nesta estiverem contidos caracteres como cedilha ('ç'), letras com til (ã, õ), etc...

Eu fiz o seguinte teste:
printf("%d", strlen("ç"));
e notei que a função retornou o valor 2, quando deveria retornar 1, ou seja, para esses tipos de caracteres ela esta retornando sempre 2.

Alguem teria uma idéia do porquê está acontencendo isso?
Estou usando a distro Suse Linux 9.2 Profissional kernel 2.6.8, com gcc versão 3.3.4 (pre 3.3.5 20040809).

Muito obrigado desde já,
Alexandre.

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

2. Re: Função strlen (problema)

Enviado em 01/12/2005 - 01:43h

fiz um teste aqui:
$cat strlen.c
#include <stdio.h>
#include <string.h>
int main (void)
{

printf("o caracter %c tem tamanho %d\n",'ç', strlen("ç"));

return (0);
}
$./a.out
o caracter ç tem tamanho 1
$

o que deve estar acontecendo é uma opção de localização estar sendo setada de forma que o seu conjunto de caracteres ascii seja expandido para 2 bits, não manjo muito mas isso pode ser uma explicação
faz um...

cat /etc/environment

e depois da uma olhada no 'man ascii'

tem algo bem esquisito ai... :/

3. Re: Função strlen (problema)

Enviado em 01/12/2005 - 09:16h

peczenyj,

Com esse mesmo código seu fiz alguns teste aqui, e o resultado:

$ gcc strlen.c -o strlen
strlen.c:6:42: warning: multi-character character constant
$ ./strlen
o caracter \uffff tem tamanho 2

$ gcc -finput-charset=ISO-8859-1 strlen.c -o strlen
./strlen
o caracter \uffff tem tamanho 4

$gcc -finput-charset=UTF-8 strlen.c -o strlen
strlen.c:6:42: warning: multi-character character constant
$ ./strlen
o caracter \uffff tem tamanho 2

$ gcc strlen.c -o strlen -Wno-multichar
$ ./strlen
o caracter \uffff tem tamanho 2

Não foi positivo :(

$ gcc --version
gcc (GCC) 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu9)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Nycholas de Oliveira e Oliveira - o_lalertom

4. Re: Função strlen (problema)

Enviado em 09/12/2005 - 01:25h

Acho que isso pode ser incompatibilidade com o padrão UTF-8(1 caracter usa 2 bytes) tente modificar para ISO-8859 ou outra(1 caracter usa 1 byte) e ver se o problema continua.

5. Re: Função strlen (problema)

Enviado em 09/12/2005 - 10:45h

Oi pessoal, desculpem-me pela ausência (ando meio ocupado).
Bom, já resolvi o problema... instalei o Slackware 10.2 (minha distro antiga) eheheh... ou seja, na verdade, não resolvi o problema, só fugi dele :-) É que eu realmente precisava da strlen funcionando integralmente, e então eu realmente não tive escolha e tive que adotar essa solução "burra" =\.
Concordo com você jllucca, também acho que há grandes chances de ser algum problema relacionado com o padrão que ele está utilizando pra codificar os caracteres. Essa "modificação" que você fala é no gcc? Seria o parâmetro -finput-charset que o o_lalertom utiliza?

T+,
Alexandre.

6. Re: Função strlen (problema)

Enviado em 12/12/2005 - 18:07h

não, a minha opção era no kernel que tem uma opcao dessas para alterar essa configuracao. Mas, deve ter algum arquivo que não sei que faz isso também.

7. strlen2()

Enviado em 03/05/2006 - 16:55h

Tambem estava a fazer um programinha e nele precisava de utilizar essa função e também deu erro então escrevi a minha(exemplo):
int strlen(chatr text[])
{
int i=0;
while(text[i]!='\0')
i++;
return i;}

8. strlen correcao

Enviado em 03/05/2006 - 16:56h

em cima onde tem 'em cima onde tem 'Helio, vc está certo, isso é o chamado caractere terminador, e em qualquer string é dessa forma:
Exemplo.

char NOME[20];

strcpy (NOME,"Helio");

ficaria assim

H e l i o '\0'
0 1 2 3 4 5

por isso que o strlen sempre retorna um caractere a mais do que o que você vê na tela

' e pa substituir por: pelica barra zero pelica
(sem os espaçoa) Isto nao passa direito kuando se posta o coment!!!)
Experuh ter ajudado!!

' e pa substituir por: pelica barra zero pelica
(sem os espaçoa) Isto nao passa direito kuando se posta o coment!!!)
Experuh ter ajudado!!

9. ...

Enviado em 17/07/2006 - 08:39h

Sei que tem muito tempo que o topico esta parado, mas com essa funcao funcinou beleza:

#include <stdio.h>
#include <stdlib.h>

int stringLen(char *str){
register int i=1;
while(*str && i++) *str++;
return (i-1);
}

int main(void){
printf("Len: %d\n", stringLen("ç"));
getch();
}

10. Função strlen (problema)

Enviado em 14/11/2007 - 10:53h

Pessoal, o texto "ç" é substituído por uma string e strings são vetores que contém uma sequência de caracteres terminadas com uma \ (barra) seguinda de um 0 (zero) na ultima posição válida da string.
Assim:

char *foo = "algum texto";

o código acima cria uma string com tamanho 12. Isso para que caiba o barra_zero na ultima posição. por isso strlen("ç") vem com 2... é um vetor de caracteres com 2 espaços. Um para o ç e outro para o caractere de final de string.

para utilizar de forma correta o strlen é só fazer o seguinte:
printf("O tamanho da string e: %d\n", strlen("texto")-1);

Até...

11. Helio!

Enviado em 14/11/2007 - 11:23h

Helio, vocês está equivocado!

A strlen deve ser usada como sempre foi usada e não tem absolutamente nada de errado com ela. Qualquer outra função strlen que seja feita irá incorrer no mesmo erro!

O fato já foi explicado, um caractere acentuado em UTF8 usa DOIS CARS e não apenas um. logo, em UTF8 um ç realmente são dois cars!! A "correção" (ou adaptação) de uma função strlen2 deveria testar se o primeiro cars é um car de entrada UTF8 para não contar duas vezes.

Este MESMO EFEITO também será notado ao se colocar um "teste\n" em um DOS, pois no DOS um '\n' é representado por DOIS cars, o 10 (line feed) e um 13 (enter) enquanto que no Linux bastam um (10).


12. Re: Função strlen (problema)

Enviado em 23/11/2007 - 00:06h

Helio, vc está certo, isso é o chamado caractere terminador, e em qualquer string é dessa forma:
Exemplo.

char NOME[20];

strcpy (NOME,"Helio");

ficaria assim

H e l i o '\0'
0 1 2 3 4 5

por isso que o strlen sempre retorna um caractere a mais do que o que você vê na tela

01 02

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Responder tópico

Entre na sua conta para responder.

Fazer login para responder