Hallo!
Frage zum Thema "Arrays und Strings" in C:
Wie schaffe ich es, einen String in umgekehrter Reihenfolge (z.B. inna statt anni) in ein anderes array zu kopieren?
rami Gast |
rami Gast |
Hallo!
Frage zum Thema "Arrays und Strings" in C:
Wie schaffe ich es, einen String in umgekehrter Reihenfolge (z.B. inna statt anni) in ein anderes array zu kopieren?
Mh... ca. so:
#include <stdio.h>
int main(int argc, char *argv[])
{
char str[20] = "hallo";
printf(str);
printf("\n");
strrev(str);
printf(str);
printf("\n");
system("PAUSE");
return 0;
}
Achso, du willst es in ein anderes Array, naja dann so:
#include <stdio.h>
int main(int argc, char *argv[])
{
char str[20] = "hallo";
char rev[20];
strcpy(rev, str);
printf(str);
printf("\n");
strrev(rev);
printf(rev);
printf("\n");
system("PAUSE");
return 0;
}
Da wäre dann nur noch die Implementierung der strrev-Funktion interessant, IIRC gibts die nämlich in keiner Standardbibliothek.
Koennte insgesamt eher so aussehen:
#include <stdio.h>
char *strrev( char *s );
void main( int argc, char **argv ) {
char buf[1024];
char *rev;
rev = strrev( buf );
printf( "%s\n%s\n", buf, rev );
}
char *strrev( char *s ) {
static char r[1024];
int i, j, l;
for ( l = 0; s[l] != '\0'; l++ );
for ( i = 0, j = l - 1; i < l; i++, j-- ) r[i] = s[j];
r[i] = '\0';
return( r );
}
Interessante vorgehensweise.
Wobei bei mir (unter Windows, mit Dev-cpp) die methode strrev(const char*) existiert, und ich den Code auch erfolgreich getestet habe!
Und ich habe auch ein C Projekt benutzt und kein C++, und es als C compilieren lassen.
Naja, um es etwas anders als du zu loesen (da ich deinen Code etwas aufwendig finde) habe ich es nochmal verfasst:
#include <stdio.h>
int main(int argc, char *argv[])
{
char str[20] = "hallo";
char rev[20];
int i;
for(i = 0; i < sizeof(rev); i++)
rev[i] = 0;
printf(str);
printf("\n");
int len = strlen(str);
for(i = 0; i < len; i++)
rev[len - i - 1] = str[i];
printf(rev);
printf("\n");
system("PAUSE");
return 0;
}
Du hast recht, dein Code ist übersichtlicher. Macht aber im Prinzip genau dasselbe, d.h. strlen zählt auch bloss die Characters wie in meiner ersten for-Schleife (und IIRC ist das auch genau so implementiert) und in der Kopierschleife habe ich ne zusätzliche Variable eingeführt um nicht jedes Mal len - i rechnen zu müssen.
Einziger Kritikpunkt: Das hier
for(i = 0; i < sizeof(rev); i++)
rev[i] = 0;
wird bei großen Strings beliebig ineffizient und ist absolut unnötig. Am Ende einmal 0 dranhängen reicht.
Ja, wuerde dann so aussehen:
rev[strlen(str)] = 0;
oder wie du es wahrscheinlich schreiben wuerdest:rev[strlen(str)] = '\0';
oder wenn man es auf die Geschwindigkeit anlegt, dann verwendet man die "len" variable, die ja die laenge schon hat:rev[len] = '\0';
wo man des macht is im Prinzip egal, nur muss es vor der verwendung (ausgabe) des Strings sein, sonst wuerde er je nach dem was in dem Speicher war irgendwas hinschreiben^^
Weils grade so schoen zum Thema "Strings" dazu passt:
Wie kette ich 2 Strings aneinander?
Ich meine nicht, einfach nur die 2 Arrays addieren. Sondern z.B. bei einem Funktionsaufruf, oder einer printf Ausgabe.
In Java geht das einfach mit +:
String x = "hallo";
String xy = x + " du da"; //xy = hallo du da
Aber wie in C++, oder geht es gar nicht und man muss sich ne Funktion dafuer schreiben?Mit "richtigen" Strings (aus der Standardbibliothek) geht das auch so:
std::string a = "hallo";
std::string b = a + " du da";
Wenn du char* hast, gibt es die Funktion strcat( char *dest, char *source). (Eine Kopie von) source wird an dest drangehaengt:char dest[255] = "hallo" ;
char source[30] = " du da" ;
strcat( dest, source );
« Tilgungsplan in C++ programmieren | Mit Batch Datei Text Datei erzeugen » | ||