Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

C zu doof für strings





Frage

Hi, ich hab ne komische Problem mit C und stringbehandlung: ich möchte aus einen string, der ein datum enthält (z.B. "21.01.2005"), Tag, Monat und Jahr rauskopieren um damit rechnen zu können. Dazu mache ich folgendes: ... #include <string.h> ... char *tag,*monat,*jahr; ... tag=(char*)malloc(2); monat=(char*)malloc(2); jahr=(char*)malloc(4); *tag=NULL; *monat=NULL; *jahr=NULL; ... strncpy(tag,sd,2); strncpy(monat,sd+3,2); strncpy(jahr,sd+6,4); tag[2]=monat[2]=jahr[4]=´

Antwort 1 von raikm

da oben stimmt was nicht, also hier die fortsetzung:

strncpy(tag,sd,2);
strncpy(monat,sd+3,2);
strncpy(jahr,sd+6,4);
tag[2]=monat[2]=jahr[4]=´

Antwort 2 von raikm

ach grütze... schuld ist das terminierungszeichen im letzten satz! also nochmal komplett ohne, vielleicht kann den salat ein admin richten :->

ich möchte aus einen string, der ein datum enthält (z.B. "21.01.2005"), Tag, Monat und Jahr rauskopieren um damit rechnen zu können.
Dazu mache ich folgendes:

...
#include <string.h>
...
char *tag,*monat,*jahr;
...
tag=(char*)malloc(2);
monat=(char*)malloc(2);
jahr=(char*)malloc(4);
*tag=NULL;
*monat=NULL;
*jahr=NULL;
...
strncpy(tag,sd,2);
strncpy(monat,sd+3,2);
strncpy(jahr,sd+6,4);
tag[2]=monat[2]=jahr[4]=[terminierungszeichen];
...

Manchmal passiert es, dass ein strncpy einfach nicht funktioniert, d.h. dass z.B. bei tag nichts drinsteht. bei monat und jahr schon. aber komischerweise geht es manchmal auch. ich habe da noch kein system gefunden. das selbe problem hab ich auch bei anderen sache, wo ich strings zerschneide und in andere variablen kopieren möchte. ist da einer fehler in der matrix oder hab ich was dummes übersehen?

mfg & danke, raik

Antwort 3 von draack

Hi,

du hast nicht übersehen, dass Strings immer aus der Anzahl der Zeichen plus dem Terminierungssymbol ("

Antwort 4 von draack

Fortsetzung ... die Forensoftware mag meine Null nicht ...

... Terminierungssymbol ("0") bestehen - allerdings allozierst du den Speicherplatz nur für die Zeichen und nicht für die Zeichen plus dem Terminierungssymbol. Außerdem solltest du besser "calloc()" an Stelle von "malloc()" verwenden:

...
  tag=(char*)calloc(3, sizeof(char));
  monat=(char*)calloc(3, sizeof(char));
  jahr=(char*)calloc(5, sizeof(char));
...

Tschö,
Volker

P.S.: Keine Gewähr auf Richtigkeit - mein letztes C-Programm ist schon etwas älter ...

Antwort 5 von raikm

danke erstmal für den hinweis, aber die verwendung von calloc statt malloc hat das problem auch nicht lösen können. gibt es denn grundsätzlichen einen einfacherer (oder anderen) weg einen string in substrings zu zerteilen und anderswo zu speichern?

Antwort 6 von draack

Hi,

dein Problem ist nicht die Verwendung von
malloc()
- sondern du reservierst nicht genug Speicherplatz. Ein String "2005" benutzt in C nicht 4 sondern 5 Zeichen.
In Hexdarstellung wird das deutlicher:

Ein String "2005" entspricht dem Array
{0x32,0x30,0x30,0x35,0x00}
.

Außerdem solltest du zusätzlich immer noch überprüfen, ob der Aufruf von
calloc()/malloc()
wirklich erfolgreich war.

Tschö,
Volker

Antwort 7 von vasquez

#include <string.h>
{...
char *tag,*monat,*jahr;
int i=0;
int iTag=1;
...
tag=(char*)malloc( 8 );
monat=(char*)malloc( 8 );
jahr=(char*)malloc( 8 );
if( tag &&monat && jahr){
//was ist sd ?? der string der das datum enthält?
//nehme ich mal an?!
//und "21.01.2005 ist" das standart format das
//du einliest:
sscanf(sd,"%s.%s.%s",tag , monat , jahr);
sscanf(tag,"%d",&iTag);
...
free(tag);
free(monat);
free(jahr);
}
......
......

}

bei den format zeichen müsstest du eventuell etwas knobeln , vieleicht musst du die mit %2s ersettzen jeweils ,