WinFuture-Forum.de: C Programmierung: Variablen Asdrücke Um Zeichen(ketten) Erweitern - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

C Programmierung: Variablen Asdrücke Um Zeichen(ketten) Erweitern Simple Frage eines Anfängers....


#1 Mitglied ist offline   wiseguy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 23
  • Beigetreten: 15. März 06
  • Reputation: 0

geschrieben 18. April 2006 - 12:54

Hallo

Ich möchte eine Variable um ein Zeichen bzw. eine Zeichenkette erweitern. Das soll in etwa wie folgt aussehen:
char file = argv[1] + ".dat";

(So bringt der Kompiler aber den Fehler: "invalid operands to binary +"

Ich habe dann verschiedene Kombinationen ausprobiert, darunter diese:
char file = (argv[1] , ".dat");


Leider ohne Erfolg. Hier enthält die Variable "file" nur die Zeichenkette ".dat"

Kann mir jemand sagen, wie ich eine solche Verkettung realisieren kann?

mfg
0

Anzeige



#2 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.505
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 18. April 2006 - 13:03

argv[1] ist ein char[], ".dat" hingegen ist entweder ein CString oder ein Integer (!). Willst du es nicht einmal mit strncpy() versuchen?
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#3 Mitglied ist offline   wiseguy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 23
  • Beigetreten: 15. März 06
  • Reputation: 0

geschrieben 18. April 2006 - 14:01

Aber mit strcpy kopiere ich doch nur den Inhalt von einem Array in ein anderes Array.

In Meinem Fall brauche ich einen Datei Namen, der beim Aufruf des Befehls mit angegeben wird und um die Endung .dat erweitert werden muss.

Wenn das mit strcpy geht, kannst du mir da sagen, was ich konkret schreiben muss um die Endung ".dat" an die im 1. Parameter angegebe Zeichenkette anzuhängen und in eine neue Variable zu speichern?

mfg
0

#4 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.505
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 18. April 2006 - 14:33

Zitat

Aber mit strcpy kopiere ich doch nur den Inhalt von einem Array in ein anderes Array.

Genau. Und was ist ein String? Ein Array of Char!

Außerdem ist argv[foo] sowieso read-only, d.h. du musst umkopieren.

size_t argvsize = sizeof(argv[1]);
const char* filename=malloc(argvsize+4);
strncpy(filename,argv[1],argvsize);
strncpy(filename+argvsize-1,L".dat",4);
filename[argvsize+3]='\0';

Da fällt mir ein, hast du es schon mal mit L".dat" statt ".dat" probiert?
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#5 Mitglied ist offline   wiseguy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 23
  • Beigetreten: 15. März 06
  • Reputation: 0

geschrieben 18. April 2006 - 15:20

Zitat

size_t argvsize = sizeof(argv[1]);
const char* filename=malloc(argvsize+4);
strncpy(filename,argv[1],argvsize);
strncpy(filename+argvsize-1,L".dat",4);
filename[argvsize+3]='\0';


Ich bin mir nicht sicher in wiefern ich das alles so übernehmen kann

Wenn ich das genauso eingebe, gibt mein Kompiler folgende Fehlermeldungen aus:

Zitat

parse error before `argvsize'


Also habe ich das "size_t" raus genommen - was bedeutet das eigentlich?

Nun kommt noch die Fehlermeldung:

Zitat

parse error before `const'


Also habe ich auch das " const" raus genommen.

... ich schreib gleich nachher weiter. Ich fahr nach Hause.

Vielleicht kannst du mir aber so schon was sagen.

meine Version:
argvsize = sizeof(argv[1]);
filename = malloc (argvsize+4);
strncpy (filename,argv[1],argvsize);
strncpy (filename+argvsize-1,".dat",4);
filename[argvsize+3]='\0';

file = filename;
printf ("%s\n", file);


Letztlich kommt noch die Fehlermeldung, wenn ich die Variale auslesen will.
Segmentation Fault (core dumped)
0

#6 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.505
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 18. April 2006 - 16:07

Zitat

Also habe ich das "size_t" raus genommen - was bedeutet das eigentlich?

Du meine Güte, ein wahrer N00b. size_t ist ein systemabhängiger Integer-Datentyp, im Zweifelsfalle solltest du ihn durch 'int' ersetzen. Dann klappt's auch mit 'm Parsen.

Zitat

Letztlich kommt noch die Fehlermeldung, wenn ich die Variale auslesen will. Segmentation Fault (core dumped)

Hoppala, natürlich sollte es strsize(argv[1]) heißen.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#7 Mitglied ist offline   wiseguy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 23
  • Beigetreten: 15. März 06
  • Reputation: 0

geschrieben 19. April 2006 - 08:17

Genau - bin ein totaler Noob - aber jeder muss mal beim Noob Status anfangen ;-)

Nun hab ich also folgendes dort stehen:
char argvsize = sizeof(argv[1]);
const char * filename=malloc(argvsize+4);
strncpy(filename,argv[1],argvsize);
strncpy(filename+argvsize-1,L".dat",4);
filename[argvsize+3]='\0';


Und wo muss ich jetzt das "strsize(argv[1])" einsetzen bzw. gegen was austauschen?

Ohne diesen austausch - also mit genau dem Quellcode - bringt der Kompiler die Fehlermeldung "assignment of read-only location".
Also hab ich das const entfernt und nun kommt keine Fehlermeldung mehr. Ist das read only wichtig für die Ausführung?
Wo ist der neue Wert denn nun gespeichert? In filename nehme ich an, oder?

Ich hab versucht mit "printf("%s\n", filename);" diesen Wert auszugeben. Aber ich bekomme nur die ersten 3 Zeichen. Also wenn ich zum Beispiel mit dem Parameter "test" aufrufe, wird mit "tes" ausgegeben.

Vielen Dank für deine Hilfe.

Dieser Beitrag wurde von wiseguy bearbeitet: 19. April 2006 - 08:17

0

#8 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.505
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 19. April 2006 - 15:43

sizeof(argv[1]) durch strsize(argv[1]) ersetzen, sonst liefert er statt der Länge des Strings nur 4 (pointer size) zurück.

Zitat

"assignment of read-only location"

Ja, das verdammte const. Die Nul-Term-Semantik ist bei strncpy() nicht genau definiert, daher kann es halt sein, daß man manuell ein '\0' anhängen muss.

Zitat

Ich hab versucht mit "printf("%s\n", filename);" diesen Wert auszugeben. Aber ich bekomme nur die ersten 3 Zeichen. Also wenn ich zum Beispiel mit dem Parameter "test" aufrufe, wird mit "tes" ausgegeben.

Dann versuche mal

strncpy(filename[0],argv[1][0],argvsize);
strncpy(filename[argvsize],L".dat",4);

und lasse das Zufügen des \0 weg.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#9 Mitglied ist offline   wiseguy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 23
  • Beigetreten: 15. März 06
  • Reputation: 0

geschrieben 19. April 2006 - 16:44

nun erhalte ich beim Kompilieren die Fehlermeldung:

Zitat

Undefined first referenced
symbol in file
strsize /var/tmp/ccDWN5FD.o
ld: fatal: Symbol referencing errors. No output written to mtm
collect2: ld returned 1 exit status


Was sagt mir das?

PS: mtm ist der jetzige Name des Programms

Dieser Beitrag wurde von wiseguy bearbeitet: 19. April 2006 - 16:46

0

#10 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.505
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 19. April 2006 - 16:48

Hm... laut ISO C99 ist 'strsize' ein Makro für 'strlen'. Aber gut, nimmste halt strlen.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0