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"
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.
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...
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, 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.
|
|