[BuS] Fragen zu C

[TI] Einführung in die Technische Informatik
[BuS] Betriebssysteme und Systemsoftware
[PSP] Praktikum Systemprogrammierung
[DakS] Datenkommunikation und Sicherheit

Fragen zu C

Beitragvon Fighter_MV » 24.10.07 11:37

Ich fand den C-Einführungskurs recht dämlich und mit den Folien kann man irgendwie auch nichts anfangen.

Ich habe einige Kompilier-Fehler und weiß nicht warum:

Code: Alles auswählen
char codeword[100];
char text[100];
char lockedMessage[100];
char unlockedMessage[100];
int codewordLength;
int textLength;

//! if text is longer than codeword, then repeat codeword until it fits the whole text
[color=red]if (codewordLength < textLength)[/color]
{
        int j = 0;
   for (int i = codewordLength; i < textLength; i++)
   {
      if (j = codewordLength-1)
      {
                   j = 0;
      }
      [color=red]codeword[i] = codeword[j];[/color]
      j++;
   }
}

[...]

static void main(void)
{
   //! receive codeword from user and save it into codeword[]
   printf("Please enter a codeword: ");
   scanf(%s , codeword);
   
    codewordLength = strlen(codeword);
   
   //! receive text from user and save it into text[]
   printf("Thank you");
   printf("Now enter your message please: "\n);
   scanf(%s , text);
   
    textLength = strlen(text);

[...]


Die rot markierten sind als Fehler markiert
Fighter_MV
 
Beiträge: 400
Registriert: 25.09.06 14:51
Wohnort: Eschweiler
Studiengang: Informatik (M.Sc.)
Studiert seit: WS 07/08
Anwendungsfach: BWL

Beitragvon p0llux » 24.10.07 11:40

Du könntest damit anfangen, die Anweisungen in eine Funktion zu fassen.
Frag' mich nicht, ich putz' hier nur...
Benutzeravatar
p0llux
Matt Eicheln
 
Beiträge: 841
Registriert: 07.12.05 17:03
Wohnort: Aachen

Beitragvon Fighter_MV » 24.10.07 12:07

danke... blöder Fehler...

Jetzt kompiliert alles, aber das Programm lässt sich nicht starten

Die Dos-Shell öffnter sich für den Bruchteil einer Sekunde und schließt dann wieder.

Genau so passiert es auch, wenn ich die vom Lehrstuhl bereitgestellten Programme ausführen will :(
Fighter_MV
 
Beiträge: 400
Registriert: 25.09.06 14:51
Wohnort: Eschweiler
Studiengang: Informatik (M.Sc.)
Studiert seit: WS 07/08
Anwendungsfach: BWL

Beitragvon p0llux » 24.10.07 12:22

Dann solltest du vielleicht die Shell manuell öffnen und da die .exe Datei oder was immer du erzeugst aufrufen ;)
Zuletzt geändert von p0llux am 24.10.07 12:22, insgesamt 1-mal geändert.
Frag' mich nicht, ich putz' hier nur...
Benutzeravatar
p0llux
Matt Eicheln
 
Beiträge: 841
Registriert: 07.12.05 17:03
Wohnort: Aachen

Beitragvon Martin » 24.10.07 12:22

Ganz klarer Layer-8-Fehler.
Martin
10100111001
 
Beiträge: 1932
Registriert: 09.09.05 17:47
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon CrazyPumuckl » 24.10.07 12:30

Wie kann man denn mit scanf Leerzeichen in den String aufnehmen? bei mir verträgt der keine leerzeichen, weil er sonst das wort nach dem leerzeichen schon als eingabe für den nächsten scanf.aufruf verwendet.
\frac{0}{0}
Benutzeravatar
CrazyPumuckl
 
Beiträge: 557
Registriert: 17.11.06 11:31

Beitragvon mgla » 24.10.07 13:23

Fighter_MV hat geschrieben:danke... blöder Fehler...

Jetzt kompiliert alles, aber das Programm lässt sich nicht starten

Die Dos-Shell öffnter sich für den Bruchteil einer Sekunde und schließt dann wieder.

Genau so passiert es auch, wenn ich die vom Lehrstuhl bereitgestellten Programme ausführen will :(


Ich mach das so das ich bei meinen eigenen programmen am Ende der main() noch einmal scanf() mache, damit das Programm nochmal auf eine Eingabe wartet. Dieser Windows-Shellersatz ist schon etwas mager, ganz allgemein.
mgla
 
Beiträge: 121
Registriert: 07.01.07 14:31
Wohnort: Aachen

Beitragvon Coolcat » 24.10.07 13:49

Wie kann man denn mit scanf Leerzeichen in den String aufnehmen?

Beispielsweise die Funktion gets benutzen ;)

Allgemein mal:
(Abschnitt "Standard C Library")
http://www.cppreference.com/
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon Fighter_MV » 24.10.07 13:51

Starten kann ich es jetzt.

Allerdings habe ich ein Problem mit dem Einlesen von Usereingaben

Ein Beispiel: (ja alles richtig in Funktionen drin :P)

Code: Alles auswählen

char testwort[100];
scanf("%s", testwort);
printf("Dein Testwort ist %s", testwort);



In der letzten linie schmiert er ab. Er fragt alles korrekt ab, aber es wird nicht mehr angezeigt.

diese "%s"-Dinger die ich in so eine Abfrage machen muss sind temporäre Variablen, oder wie soll ich das Ganze verstehen?

Irgendwie blick ich gar nicht durch, wie ich eingegebene Werte vernünftig weiterverwenden kann.
Fighter_MV
 
Beiträge: 400
Registriert: 25.09.06 14:51
Wohnort: Eschweiler
Studiengang: Informatik (M.Sc.)
Studiert seit: WS 07/08
Anwendungsfach: BWL

Beitragvon Coolcat » 24.10.07 14:01

@Fighter_MV: Dein Quellcode funktioniert bei mir. ;)

@mein eigener Post von eben:
Ok, besser fgets benutzen, wegen möglichem Bufferoverflow.
Code: Alles auswählen
#include <stdio.h>

int main(int argc, char** args) {
   char s[10];
   // char *fgets( char *str, int num, FILE *stream );
   if (fgets(s, 10, stdin)) {
      printf(s);
   }
   else {
      printf("error");
   }
   printf("\n");
}

Code: Alles auswählen
[coolcat@sempron2800 ~]$ cc -o test test.c
[coolcat@sempron2800 ~]$ ./test
01234567890
012345678
[coolcat@sempron2800 ~]$     
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon Teq » 24.10.07 14:15

Fighter_MV hat geschrieben:diese "%s"-Dinger die ich in so eine Abfrage machen muss sind temporäre Variablen, oder wie soll ich das Ganze verstehen?


Wenn du das printf meinst:
Das %s gibt sozusagen an, wie die Variable für die Ausgabe interpretiert werden soll.
Hinter dem Link findest du alle möglichen Interpretationen...
http://www.cplusplus.com/reference/clibrary/cstdio/printf.html

Für das scanf:
http://www.cplusplus.com/reference/clibrary/cstdio/scanf.html
So ähnlich wie bei printf, halt nur für die Eingabe...
Benutzeravatar
Teq
 
Beiträge: 357
Registriert: 15.09.05 19:32
Wohnort: Aachen, Kullenhof
Studiengang: Informatik (Dipl.)
Anwendungsfach: E-Technik

Beitragvon Fighter_MV » 24.10.07 18:47

Irgendwie spinnt alles total.

Ich hab folgenden Code:


Code: Alles auswählen
void justice(void)
{
        if (codewordLength < textLength)
        {
            int i = codewordLength;               
            int j = 0;
              while (i < textLength)
            {
                if (j = codewordLength-1)
                  {
                   j = 0;
                }
                codeword[i] = codeword[j];
                j++;
                i++;
            }
        }
        printf("%s", codeword);
}


main()
{
   //! receive codeword from user and save it into codeword[]
   printf("Please enter a codeword: ");
   scanf("%s", codeword);
   
    codewordLength = strlen(codeword);
   
    printf("%s", codeword);
   printf("Die Laenge des Codewords ist %i", codewordLength);
   
   
   //! receive text from user and save it into text[]
   printf("Thank you\n");
   printf("Now enter your message please: ");
   scanf("%s", text);
   
      
    textLength = strlen(text);
   
    printf("%s", text);
   printf("Die Laenge des Textes ist %i", textLength);
   
    justice();
   
    lock();
   
    printf("%s", lockedMessage);
}



lock() ist erst mal unwichtig, da vorher unsinnige Sachen rauskommen.

In meiner Void werden die Sachen eingelesen.

Zur Kontrolle lasse ich mir alles direkt zurückgeben.

Bei der Eingabe "hallo" als Codewort bekomme ich "hallo" und die Länge 5 zurück.

Bei der Eingabe "diessind" als text bekomme ich "diessind" und die Länge 8 zurück.

Alles schön und gut.

Wenn ich jetzt die fehlenden Buchstaben in meinem Codewort auffüllen will, rufe ich die Funktion justice() auf.

Dort will ich mir am Ende "hallohal" ausgeben lassen, aber stattdessen bekomme ich:

"hallohhhYYYYYYYY"


Kann mir das eventuell jemand erklären?

Danke im Vorraus!
Fighter_MV
 
Beiträge: 400
Registriert: 25.09.06 14:51
Wohnort: Eschweiler
Studiengang: Informatik (M.Sc.)
Studiert seit: WS 07/08
Anwendungsfach: BWL

Beitragvon Coolcat » 24.10.07 19:11

Irgendwie spinnt alles total.

Dein Quellcode da kompiliert so auch nie im Leben. Deklariere mal alle deine Variablen. Außerdem überschreibst du die Null-Terminierung deines codeword's und setzt sie anschließend nicht neu.
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon SpatzenArsch » 24.10.07 19:21

Das alles total spinnt wundert mich bei dem Code ehrlich gesagt nicht. Du solltest tatsächlich wie von Coolcat angedeutet auf deine globalen Variablen (die du uns wohl vorenthalten hast) verzichten und das erstmal ordentlich strukturieren. Desweiteren ist die Zeile:
Code: Alles auswählen
 if (j = codewordLength-1)

vermutlich nicht das was du da machen möchtest. Du weist j nämlich codewordLength-1 zu und die if Bedingung ergibt genau dann true wenn codewordLength-1 != 0 ist. Beim vergleichen benutzt man in C den == Operator.
SpatzenArsch
 
Beiträge: 202
Registriert: 15.04.06 12:14

Beitragvon CrazyPumuckl » 24.10.07 19:34

"lassen Sie dabei die Funktionsvereinbarung unverändert"

Was heißt das genau? Darf ich da den Rumpf nicht ändern, die Parameterzeile oder die ganze Funktion nicht ändern?
\frac{0}{0}
Benutzeravatar
CrazyPumuckl
 
Beiträge: 557
Registriert: 17.11.06 11:31

Nächste

Zurück zu Technische Informatik