Problem in C

Hi zusammen! ehrlich gesagt stehe ich was auf dem Schlauch und ich hoffe hier paar Anregungen und Vorschläge zu finden, da ich noch nicht so ganz erfahren in C-Programmieren bin.

Also, ich würde gerne aus einer zuöffnenden Textdatei, welche über einen Funktionsaufruf öffnet auf die darin enthaltenen Wörter zugreifen und als returnwert an das Hauotprogramm zurückgeben werden. Im Hauptprogramm soll dann auf jedes einzelne Wort der Sätze innerhalb eines Arrays oder so zugegriffen werden können, um jeden Buchstaben eines Wortes dann in eine Zahl umzuwandeln und in einem anderen Feld als intwert zu speichern. dabei wäre eben wichtig, das die einzelnen Wörter dann auch eine identische Zahlenanzahl vorweisen

A=1 U=33 f=14 Leerzeichen=0 A=1 R=19 B=11 E=2 i=23 t=7

Somit sollte der Satz(ich nenne es mal so) Auf Arbeit die Zahlenfolge
1 33 14 0 1 19 11 23 7

Leider hängt es bei mir schon daran, dass ich die Datei zwar geöffnet bekomme und auch auf die Wörter zugreifen kann, ich sie jedoch nicht in das Hauptprogramm übergeben kann.

Ich hoffe ihr konntet mir folgen^^
Für Anregungen wäre ich echt dankbar!
 
hört sich nicht schwierig an, hab aber grad keine Zeit (muss automatisierungstechnik lernen *pfui*). Zeig mal was du schon hast. Ich muss meine Hausübungen auch selber machen... ;)
 
Wenn deine Funktion ein Array zurückgeben soll musst du ihr als zusätzlichen Parameter einen Pointer auf ein hinreichend großes Array übergeben. Dann kannst in diesem Array die einzelen Wörter speichern und aus dem Hauptgramm darauf zugreifen.

Eigentlich müsstet ihr das schon behandelt haben, wenn du so eine Aufgabe Programmieren musst, also einfach mal in deinem Script nachschauen ;-)
 
Also erstmal ist das keine Hausaufgabe, viel mehr bin ich dran mir C selbst beizubringen und ich habe hier zur Zeit nur ein Buch, wo es keine Lösungen zu gibt. Und wenn man es selbst probiert, lerne ich zumindest am meissten!

Nun, ich fange jetzt erstmal ohne die Öffnung aus einer Datei an und habe mal das Hauptprogramm gebildet, welches ein eingebenenes Zeichen in eine Zahl umspeichert!
Repräsentativ habe ich nur wenige Zahlenelemente und Buchstaben eingefügt um es zu testen! Klappt ja auch soweit, nur stehe ich jetzt vor dem Problem, wie ich es umsetzen kann, dass ich einen ganzen Text mit mehreren Wörtern, Buchstabe für Buchstabe durchgehen kann um dann diese Buchstaben in einen Zahlencode umzuwandeln. Ich verstehe nicht, wie ich das mit getc hinbekommen kann! Jede Leerzeile zwischen den Wörtern soll ja auch erhalten bleiben. Wie gesagt ich eill hier keine Musterlösung, sondern nur Anregungen, wie ich an den richtigen Lösungsweg kommen kann!Danke vorab

Hier mein Hauotprogramm

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 80


int main()
{
char Umwandlung[MAX];// Speicherstelle der umgewandelten Strings
char *Umwandlung2[]={"12", "13"};// index Zahlenwerte
char Alphabet[2]={'A', 'B'};// index Alphabet


char *Zeiger1;
Zeiger1=Umwandlung;
printf("Geben Sie einen Buchstaben ein:");
scanf("%c", &*Zeiger1);

int i;
for (i=0; i<2; i++)

if (*Zeiger1==Alphabet)
printf("%s", Umwandlung2);

else
Zeiger1+1;





getch();
return 0;
}
 
So kannst du ein File komplett in einer Funktion auslesen.

Code:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define BUFFER_SIZE 1024

void readFile(char *file,char *buf)
{    
     int i=0;
     FILE *fp = fopen(file,"r");
  
     while(!feof(fp))
     {
           buf[i]=fgetc(fp);  
           i++;  
     }
     fclose(fp); 
}

int main()
{
    char buffer[BUFFER_SIZE];

    readFile("c:\\bla.txt",buffer);
    printf("%s",buffer);
    system("pause");
    
  return 0;
}
 
Hmm also das klappt alles soweit nur habe ich das Problem, dass wenn ich mit zwei for Schleifen die Inhalte vergleichen will, er vor dem ersten Leerzeichen aufhört. Hier mal der wesentliche Teil.Wäre für nen Ratschlag dankbar, wie ich das Problem lösen kann!

Code:
        char Umwandlung[MAX];// Umgewandelte Buchstaben in Zahlen
	char *Umwandlung2[MAX]={"1", "2", };
	char Codezeichen[2]={'A', 'B'};//usw
    char buffer[BUFFER_SIZE];


 do
    {
    
    for (j=0; j<strlen(buffer); j++) //
     for (i=0; i<3; i++)
       		
       		if (Codezeichen[i]==buffer[j])
				Umwandlung[j]=*Umwandlung2[i];
       		else
       		continue;
       		
			   
      printf("%s",Umwandlung);		   
   } 
   while  (buffer[j]!='\0');

Wenn ich nun ne Eingabe mache von "AB BA AA" hätte ich gerne, dass er "12,21,11" in Umwandlung ablegt! Jedoch soll dann in Umwandlung[0] zb. 12 drin stehen und nicht in [0] die 1 in [1] die 2 usw.
Und ich verstehe einfach nicht, warum er nach den ersten beiden Buchstaben AB mit der Schleife aufhört! Muss ich das Leerzeichen mit einbauen oder wie?
Weiß vielleicht einer wie ich das hinbekommen kann?! Weiß wirklich nicht mehr weiter

Danke
 
Original von mauralix
So kannst du ein File komplett in einer Funktion auslesen.

Code:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define BUFFER_SIZE 1024

void readFile(char *file,char *buf)
{    
     int i=0;
     FILE *fp = fopen(file,"r");
  
     while(!feof(fp))
     {
           buf[i]=fgetc(fp);  
           i++;  
     }
     fclose(fp); 
}

int main()
{
    char buffer[BUFFER_SIZE];

    readFile("c:\\bla.txt",buffer);
    printf("%s",buffer);
    system("pause");
    
  return 0;
}

Allerdings würde ich den Code so nicht verwenden, da ein Stack-Overflow möglich ist, da die Länge des Buffers von readFile() nicht beachtet wird.

Wenn ich nun ne Eingabe mache von "AB BA AA" hätte ich gerne, dass er "12,21,11" in Umwandlung ablegt! Jedoch soll dann in Umwandlung[0] zb. 12 drin stehen und nicht in [0] die 1 in [1] die 2 usw.
Und ich verstehe einfach nicht, warum er nach den ersten beiden Buchstaben AB mit der Schleife aufhört! Muss ich das Leerzeichen mit einbauen oder wie?
Weiß vielleicht einer wie ich das hinbekommen kann?! Weiß wirklich nicht mehr weiter
Also ein Problem ist, dass du Umwandlung2 als Array aus char-Pointern definierst, jedoch ein Array aus einzelnen Zeichen willst:
Code:
...
char Umwandlung2[] = { '1', '2' };
for (j=0; j<strlen(buffer); j++)  {
     for (i=0; i<3; i++) {
       		
       		if (Codezeichen[i]==buffer[j])
				Umwandlung[j]=Umwandlung2[i];
       		else
       		continue;
       	}	
			   
      printf("%s",Umwandlung);		
}

Natürlich musst du auch darauf achten, dass Umwandlung[] genauso groß ist, wie buffer[].
Die do-while-Schleife die auf das Ende von Buffer prüft ist übrigens unnötig, da die erste Schleife schon bis zum Ende des Strings läuft(strlen(buffer)).
 
Original von mauralix
Netter Hinweis. Das ist mir aber auch klar. Sollte doch nur ein Demo Code.

Ok, dann solltest du aber darauf hinweisen. Egal ob Demo-Code oder nicht, man sollte immer versuchen keine Sicherheitsmängel im Code haben, da es leicht passieren kann, dass man "Demo Code" der Einfachheit halber in sicherheitskritischeren Projekten der Einfachheit halber wiederverwendet und die Schwachstelle dann übersehen könnte.
 
Lesco du hast natürlich immer Recht. Diese BufferOverflows sind ja auch wirklich was schlimmes. Ich muss mir mal Zeit nehmen um mich in diese Materie einzuarbeiten. Kennt jemand gute Dokumentationen, die besser sind als die ersten die man mit google findet?
 
Danke erstmal an Euch alle, finde es wirklich super von euch! Und vielleicht werde ich ja nach Jahren der Verzweiflung auch mal so fitt sein^^ Die Hoffnung stirbt zuletzt!

So hier nun meine neuste Version. Ich poste sie mal und schildere dann mein neues Problem:-)

Code:
#include <cstring>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 80
#define BUFFER_SIZE 1024

void readFile(char *file,char *buf)
{    
     int i=0;
     FILE *fp = fopen("f:\Morsecode.txt","r");
  
     while(!feof(fp))
     {
           buf[i]=fgetc(fp);  
           i++;  
     }
     fclose(fp); 
}

int main()
{
	
	char Umwandlung[MAX];
	char Umwandlung2[]={'1', '2', ...... '24'};
	char Codezeichen[2]={'A', 'B'......'Z'};
    char buffer[MAX];//BUFFER_SIZE

    readFile("f:\Text AB.txt",buffer);
    int i,j;
    
    
    printf(" \t\tDie eingelesene Datei hat folgenden Inhalt:\n\n%s\n\n",buffer);
    
    
    
    for (j=0; j<strlen(buffer); j++){ 
     for (i=0; i<3; i++)
       		{
       		if (Codezeichen[i]==buffer[j])
					Umwandlung[j]=Umwandlung2[i];
						if (' '==buffer[j]||'\0'==buffer[j])
							Umwandlung[j]=' '; 
       	
       		}
			 }  
    
      printf("%s",Umwandlung);
      
   
      getch();
  return 0;
}

Soweit so gut und das funktioniert auch soweit, nur wenn ich jetzt zum Beispiel als Text" AB Z" einlese und umwandele erhalte ich als String "12 24"
Nun würde ich gerne die Umgewandelte Zahl 24, welche für "Z steht gerne mit einem einzelnen Feld vergleichen. Sprich Wenn Umwandlung 24 dann NeuerTextbuchstabe = A.
Und genau da liegt das Problem was ich nicht gelöst bekomme. Wenn ich auf den String mit den Zahlen zugreifen will, habe ich ja jedes einzelne Zeichen im String mit einem extra Index. Sprich ich kann die 24 nicht vergleichen, da ich entweder nur die 2 oder nur die 4 über einen Index ansprechen kann! Ich habe schonmal mit strncmp versucht, jedoch bekomme ich nur Fehlermeldungen. Er soll ja auch automatisch den ganzen in Zahlen übersetzten String überprüfen und dann die gesamten aufgelisteten Zahlen wieder in Buchstaben umschreiben.
Ich habe schonmal mit

Code:
if (strstr(Umwandlung, Ganzzahl[k]) != NULL)
Text[k]=alpha[k];
versucht die Sache in den Griff zu bekommen, nur kann ich so nicht die Wortreihenfolge einhalten. Er sucht nun nach einer Stringübereinstimmung und schreibt dann den Buchstaben in Text, jedoch an falscher Stelle, ist ja auch logisch. Nur ich hätte ihn ja dann auch gerne an die richtige Stelle gesetzt! Keine Ahnung

Kann mir da einer nen Vorschlag machen, oder sagen, ob ich das überhaupt so umsetzen kann?
 
Zurück
Oben