View Full Version : Estruturas com strings em C


jopabasa
14-04-2007, 14:40
Parece que estou a retroceder no meu (ainda pequeno) processo de aprendizagem.
Não consigo perceber a seguinte situação:


#include <stdio.h>
#include <string.h>
struct tst
{
char x[12];
int y;
} test;
int main()
{
strcpy(test.x,"200704141254");
test.y=1;
printf("|%s|\n",test.x);
system("pause");
return 0;
}

Ao imprimir a string aparece também o caracter ascii do valor que coloco em test.y ...mas porquê???? 8|
Tenho a certeza que esta é mesmo de newbie!

Ajudem-me por favor.

Nazgulled
14-04-2007, 14:59
exprimenta antes do strcpy() fazeres test.x = malloc(sizeof(test.x));

Não posso testar pois tou no windows e apenas programo em linux. Ah, tens de fazer include ao stdlib.h

jopabasa
14-04-2007, 15:33
não... essa instrução não funciona: "incompatible types in assignment"

El_UnO
14-04-2007, 16:01
O output que obtenho é este:

|200704141254|

Não percebo qual é a dúvida...

jopabasa
14-04-2007, 16:25
No Dev-C++ obtenho isto:


|200704141254☺|
Prima qualquer tecla para continuar . . .


Vou experimentar no gcc...

edit:
acabei de experimentar no linux e tb acontece a mesma situação, imprimindo 13 caracteres.
El_UnO como fizeste isso?

Nazgulled
14-04-2007, 16:44
isso foi também o que me deu no dev-c++, ms como já disse, program em linux, windows é pa simples testes e coisas rápidas... é que o código que tu tens, não me parece que tenha algo de mal e julgo que se der um salto ao linux e testar, que deve funcionar na boa.

Quanto ao malloc() esquece que eu fui parvo e não tem logica nenhuma usa-lo onde te disse pa usares... my bad.

El_UnO
14-04-2007, 16:55
edit:
acabei de experimentar no linux e tb acontece a mesma situação, imprimindo 13 caracteres.
El_UnO como fizeste isso?

Copy paste do teu código e imprimiu aquilo...não vejo nada de mal nem de esquisito para dar outra coisa....a única coisa que mexi foi tirar aquele system("pause) :P

jopabasa
14-04-2007, 16:56
Nazgulled, conforme o edit ao meu post anterior, no linux dá o mesmo erro. Deve ser mesmo uma coisa parva que está no código, tão parva que se torna difícil de detectar. Estou à volta deste problema desde as 10 da manhã! Grrrrrrrrrrrr!!!!

jopabasa
14-04-2007, 17:05
El_UnO, também já substitui o system("pause") por um getchar(). Continua igual. Isto é de dar em maluco!!! No meu desktop windows dá mal. No meu portátil linux dá mal. E no teu pc dá bem? Estou embruxado como o Benfica ou quê?!?

jopabasa
14-04-2007, 17:23
reparem nesta situação:

#include <stdio.h>
#include <string.h>
struct tst
{
char x[12];
int y;
char z[3];
int w;
char v;
} test;
int main()
{
char c;
int i;
strcpy(test.x,"200704141254");
test.y=2;
strcpy(test.z,"ABC");
test.w=3;
test.v='X';
printf("|%s|%i|%s|%i|%c|\n",test.x,test.y,test.z,test.w,test.v);
for (i=0;i<=24;i++)
printf("%c|",test.x[i]);
c=getchar();
return 0;
}


o print é este:

|200704141254☻|2|ABC|3|X|
2|0|0|7|0|4|1|4|1|2|5|4|☻| | | |A|B|C| |♥| | | |X|

na 1ª string não existe o byte '\0' no final mas, na 2ª já lá está!
Hmmm... Hmmm...

rjtd
14-04-2007, 17:28
Parece que estou a retroceder no meu (ainda pequeno) processo de aprendizagem.
Não consigo perceber a seguinte situação:


#include <stdio.h>
#include <string.h>
struct tst
{
char x[12]; <<<---- Errado!
int y;
} test;
int main()
{
strcpy(test.x,"200704141254");
test.y=1;
printf("|%s|\n",test.x);
system("pause");
return 0;
}

Ao imprimir a string aparece também o caracter ascii do valor que coloco em test.y ...mas porquê???? 8|
Tenho a certeza que esta é mesmo de newbie!

Ajudem-me por favor.

É simples:
O problema é que a string "200704141254" tem 13 caracteres (os 12 que vês mais um '\0' que indica o fim da string), e tu só alocas espaço para 12. Quando copias isso do modo que fazes, em test.x não vai ficar o '\0', e como tal o printf não vai saber quando acabar de imprimir a string, e continua por lá fora.
O código correcto será :

(...)
struct tst
{
char x[13];
int y;
} test;
(...)

jopabasa
14-04-2007, 17:46
rjtd, realmente fiz a alteração que indicaste e funciona. Mas sempre pensei que ao declarar x[12] estava a falar em 13 bytes (de 0 a 12) onde test.x[12] receberia o '\0'.

rjtd
14-04-2007, 17:51
rjtd, realmente fiz a alteração que indicaste e funciona. Mas sempre pensei que ao declarar x[12] estava a falar em 13 bytes (de 0 a 12) onde test.x[12] receberia o '\0'.

Boas.
Quando declaras x[12] só podes ir de 0 a 11. Costumo ver esse erro muitas vezes: pessoas a declararem Xis caracteres e depois a fazerem ciclos for de 0 a Xis. É uma confusão comum.
Ainda bem que ficaste esclarecido.
Cumps.

jopabasa
14-04-2007, 17:54
Ok, obrigado pela ajuda a todos.