1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Estruturas com strings em C

Discussão em 'Programação' iniciada por jopabasa, 14 de Abril de 2007. (Respostas: 13; Visualizações: 1158)

  1. Parece que estou a retroceder no meu (ainda pequeno) processo de aprendizagem.
    Não consigo perceber a seguinte situação:

    Código:
    #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.
     
  2. Nazgulled

    Nazgulled Power Member

    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
     
  3. não... essa instrução não funciona: "incompatible types in assignment"
     
  4. El_UnO

    El_UnO 1st Folding then Sex

    O output que obtenho é este:

    Código:
    |200704141254|
    Não percebo qual é a dúvida...
     
  5. No Dev-C++ obtenho isto:

    Código:
    |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?
     
    Última edição: 14 de Abril de 2007
  6. Nazgulled

    Nazgulled Power Member

    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.
     
  7. El_UnO

    El_UnO 1st Folding then Sex

    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
     
  8. 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!!!!
     
  9. 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ê?!?
     
  10. reparem nesta situação:
    Código:
    #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:
    Código:
    |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...
     
  11. rjtd

    rjtd Power Member

    É 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á :
     
  12. 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'.
     
  13. rjtd

    rjtd Power Member

    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.
     
  14. Ok, obrigado pela ajuda a todos.
     

Partilhar esta Página