Função strlen (problema)

1. Função strlen (problema)

Alexandre
alexandre_a

(usa Suse)

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.


  


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

Tiago Barcellos Peczenyj
pacman

(usa Ubuntu)

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)

N
o_lalertom

(usa Slackware)

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)

Ricardo Rodrigues Lucca
jllucca

(usa Gentoo)

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)

Alexandre
alexandre_a

(usa Suse)

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)

Ricardo Rodrigues Lucca
jllucca

(usa Gentoo)

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()

Joana Silva
joanaQWP

(usa Fedora)

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]!='{TTEXTO}')
i++;
return i;}


8. strlen correcao

Joana Silva
joanaQWP

(usa Fedora)

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

em cima onde tem '{TTEXTO}' 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. ...

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

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)

Helio Campos Mello de Andrade
HelioCampos

(usa Ubuntu)

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!

Elgio Schlemer
elgio

(usa OpenSuSE)

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)

Lazaro
lazaro91

(usa Debian)

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 '{TTEXTO}'
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