galgenmännchen



  • hi ich hab ein kleines problem naja viel mehr eine frage und zwar habe ich angafangen ein minigalgenmännchenprogramm zu schreiben dabei bin ich aber auf folgendes problem gestoßen. und zwar wenn ich "check[0]" nicht mit '\n' initialisier dann wird ein strich zu viel ausgegeben (bei devc++), bei vc++ 6.0 geht das programm gar nicht, unter linux(gcc) geht es auch ohne check[0] mit \n zu initialisieren.
    wenn ich den text beispielsweise mit gets einlese geht es auch ohne \n.
    Wo liegt denn da das problem???

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      char text[50];
      char check[27];
      int i=0,j=0,found=0,k=0;
    
      check[0]='\n'; 
      fgets(text,50,stdin);
    
      system("CLS");
    
      while(1)
      {
    
          for(i=0;text[i]!='\0';i++)
          {
              for(j=0;check[j]!='\0';j++)
              {
                  if((text[i]==check[j])&&text[i]!=' ')
                  {
                      found=1;
                      break;
                  }
    
              }
                  if(found==1)
                  printf("%c",text[i]);
    
                  else if(text[i]!=' ')
                  printf("-");
    
                  else
                  printf(" ");
    
                  found=0;
          }
                  printf("\n");
    
                  for(k=0;check[k]!='\0';k++)
                      ;
    
                  fgets(check+k,27,stdin);
    
      }
    
      system("PAUSE");	
      return 0;
    }
    

    aja das programm hat noch keine abbruchbedingung wird aber noch implementiert 😉
    mfg
    blutlecker



  • also \n als initialisierung? dazu gibts doch \0
    ansonsten mach nen memset. und schreib den kompletten array voll



  • ja mit \0 zu initialisieren geht net, dann funktioniert das programm net richtig bzw es wird beim ersten durchlauf ein strich zuviel ausgegeben, wieso auch immer.
    deshalb ja check[0]='\n' wieso auch immer, dass war ja meine frage wieso das so ist???
    Aja mit was soll ich denn den array vollschreiben?
    weil dann funktioniert das hier ja nimmer:

    for(k=0;check[k]!='\0';k++);
    

    und wie ist das verhalten der unterschiedlichen compiler zu erklären?

    mfg
    blutlecker



  • ein array ohne laenge kannst du nicht fuellen. dein programm ist falsch.



  • ein array ohne laenge kannst du nicht fuellen. dein programm ist falsch.

    ???
    mein array check ist 27 lang

    char check[27];
    

    könntest du das bitte etwas näher erläutern, kann nicht wirklich was mit deiner aussage anfangen sry. vllt könntest du mir sagen, was an meinem code genau falsch ist, vielen dank im vorraus.

    mfg
    blutlecker



  • mein fehler. hab mich verlesen.



  • soll vorkommen;)
    naja aber das problem(frage) bleibt ich weiß immernochnicht woran es denn liegt.
    wäre nett, wenn jmd noch eine antwort hätte.

    mfg
    blutlecker



  • k = strlen(check);

    fgets(check+k, 27, stdin) ist gefaehrlich, weil du ueber die arraygrenzen schreiben wirst.

    verfolge den programmablauf und kreise die fehlerstelle ein.



  • Hinweis: fgets() schreibt im Normalfall (also wenn der komplette String in den Zielbuffer passt) noch das '\n' vor die '\0'. Deswegen renn die erste for-Schleife einmal zu oft.

    Zudem sollte der Einsatz von strchr() dein Programm etwas vereinfachen, sowie strlen() um den Code leserlicher zu machen.

    Die Zeile

    fgets(check+k,27,stdin);
    

    Ist falsch, da k größer 1 sein kann, und damit der Buffer "kleiner" wird (durch Pointerarithmetik mit +k). Also sollte es dann 27-k heissen.
    Zudem empfehle ich Konstanten zu verwenden anstatt die Buffergrößenmehrfach im Code zu verteilen.

    Achja: [cpp] Tags sind schöner und deine Formatierung ist *räusper* unter aller Sau.



  • vielen dank für die hilfe, sry war im urlaub, deswegen nun erst.
    naja formatierung...das is bei devc++ so ne sache aber danke, hab fehler beseitigt und code vereinfacht und nun läuft alles ohne probleme.

    mfg
    blutlecker


Anmelden zum Antworten