String kürzen..
-
Hi!
Ich muss bei einem String das erste zeichen wegnehmen, also aus "Hallo" zb "allo" machen.
Nur leider klappt das nciht so ganz, ich hab mir gedacht, ich könnte ja im index des strings wandern und einfach nacheinander die einzelnen buchstaben ausgebe wobei ich einfach den ersten weglasse, das klappt aber nicht ganz:int main(int argc, char *argv[]) { int len, i, x, argcx=5; char *temp, *argvx[5]; argvx[1] = "\"Das"; argvx[2] = "ist"; argvx[3] = "ein"; argvx[4] = "test\""; for(i=1; i<argcx; i++) { if( i == 1 ) { len = strlen(argvx[i]); for(x=1; x<len; x++) { printf("%s", argvx[i][x]); } } else { printf(" %s",argvx[i]); } } return 0; }
Im printzip bekomme ich einfach als Argument einen langen String, der dann wegen der leerzeichen ja in einzelteile zersetzt wird, dieser hat am anfang und am ende ein uhnerwünschtes zeichen, und das ziel ist, diesen mit einem zeichen weniger am anfang und einem weniger am ende auszugeben, hab auch schon an sowas wie substr gedacht, aber darüber finde ich nichts, weshalb cih davon ausgehe, das es die funktion nur in C++ gibt
Villeicht kennt ja jemand einen besseren weg..
thx n bye..
-
kommt drauf an was genau du unter wegnehmen verstehst.. eine möglichkeit wäre ein char* zu nehmen und das ein zeichen weiterzeigen zu lassen...
oder du könntest z.b. memmove nehmen
-
Hm, also, ich mach mal ein konkretes beispiel:
Der aufruf lautet:
etecho.exe "Wolfgang ging in den Wald"
Dann lautet der Output
Wolfgang ging in den Wald
Also, in diesem fall ohne das führende " und das endende ".
Hoffe das war so verständlich, was ich erreichen will^^
-
Hallo,
IMHO ist strchr() und strrchar() was du suchst.
char search='"'; int first,last; first=strchr(text,search); last=strrchr(text,search); text+=first+1; *(text+last)='\0'; return text;
-
Hm, nein, ich will ja nicht " ersetzen, sondern das erste zeichen des char, Also, nchmal etwas genauer, ich habe einfach ein wort, nehmen wir zum beisiel mal Test, jetzt muss ich aus Test das wort est machen, wenn es jetzt aber zb Molloch währe, müsste ich olloch darraus machen, also das erste zeichen entfernen, ausredieren, wegnehmen, klauen oder was auch immer^^ Das wort muss um eins kürzer werden, und das ganze am anfang des wortes, das ist mein problem, ich will nicht gezielt einen bestimmtes zeichen kicken, sondern eben dass, welches an erster stelle steht. Oder ich bin heute einfach schwer von begriff
-
Hallo,
öhm na dann
void foo(char *text){ *(text+strlen(text))='\0'; text+=1; }
-
Also, wenn ich dich richtig verstanden habe, dann meintest du das so:
void cuts(char *text){ *(text+strlen(text))='\0'; text+=1; printf("%s", text); } int main(int argc, char *argv[]) { int len, i, x, argcx=5; char *temp, *argvx[5]; argvx[1] = "Das"; argvx[2] = "ist"; argvx[3] = "ein"; argvx[4] = "test"; for(i=1; i<argcx; i++) { if( i == 1 ) { cuts(argvx[i]); } else { printf(" %s", argvx[i]); } } return 0; }
Jetzt bekomm ich leider immer den fehler "etecho.exe hat fehler verursacht und wurde geschlossen", beim Compilieren bekomm ich keine fehlermeldung
-
Hallo,
char *temp, *argvx[5]; argvx[1] = "Das"; argvx[2] = "ist"; argvx[3] = "ein"; argvx[4] = "test";
ein Arry beginnt beim 0ten Element.
Hmm wenn ich mich nicht irre müsste mein Methode eigentlich Funktionieren. Wenn sich rausstellt, dass sie für den Fehler verantwortlich ist, kannst du ja noch mal posten.
-
Hi!
Nein, ich beginne bei 1 weil später bei den argumenten 0 ja der pfad des progs selber ist, und mit argvx und argcx simmulier ich das gerade nur sozusagen^^
Bin schon ein wenig weiter:void cuts(char *text){ text+=1; printf("%s", text); } void cute(char *text){ text-=1; printf("%s", text); } int main(int argc, char *argv[]) { int i, x, argcx=5; char *argvx[5]; argvx[1] = "\"Das"; argvx[2] = "ist"; argvx[3] = "ein"; argvx[4] = "test\n\""; x = argcx; x--; cuts(argvx[1]); for(i=2; i<x; i++) { printf(" %s", argvx[i]); } cute(argvx[--argcx]); return 0; }
Jetzt ist es fast perfekt, nur funktion cute sollte eigendlcih den letzen buchgtsaben wegnehmen, nicht das ganze wort, dass mit dem text-=1; hab cih auch leider nciht so ganz verstanden, habs einfach so probiert und ging, vll kann mir das ja einer erklähren, villeicht komm ich dann drauf, wie ich diesmal den letzten buchstaben wegbekomm, ich will ja auch vertsehen was ich da mache
-
Hallo,
welchen Compiler benutzt du denn ?
Ich hatte eben beim test auch nen merkwürdiges Ergebnis. Normalerweise sollte strlen die Länge des Strings ohne das Terminierungszeichen zurück geben.
Bei BCB 6 musste ich schreiben strlen(text)-1 um an das letzte Zeichen zu kommen.Das mit den Additionen nennt sich Zeigerarithmetic. Dein Zeiger zeigt auf die Addresse des ersten Zeichens in deinem String. Wenn ich den Zeiger nun incrementiere (sprich 1 addiere) dann zeigt der auf die Addresse des zweiten Zeichens usw.
Was ich also eigentlich vorhatte war.
char *text="test"; *(text+strlen(text))='\0'; //ersetze das letzte Zeichen durch Terminierung text+=1; //jetzt sollte text eigentlich auf e zeigen.
Warum das nicht der Fall ist, intressiert mich jetzt selbst.
-
Hmm..
Also, das erste zeichen wird bei mir ja entfernt..
Nur das mit dem letzen hab ich ncoh ein problem, warum das mit text+=1 geht.
UNd dass *(text+strlen(text))='\0'; soll folglich das letze zeichen wegmachenn, also sozusagen 1 zeichen zurück, dann währen aber doch 2 terminierungszeichen hinterinander, ist das egal?
Und ich benutze devCpp..
Edit:
Also, *(text+strlen(text))='\0'; bringt bei mir das programm zum Fehler, allerdings kann cih auch dem Debug nciht entnehmen zu welchem.. wenn cih strlen(text)-1 mache ist da kein unterschied..
-
MC_Breit schrieb:
Hmm..
Nur das mit dem letzen hab ich ncoh ein problem, warum das mit text+=1 geht.
UNd dass *(text+strlen(text))='\0'; soll folglich das letze zeichen wegmachenn, also sozusagen 1 zeichen zurück, dann währen aber doch 2 terminierungszeichen hinterinander, ist das egal?Ja das ist egal. Die Ausgaberoutine gibt nur bis zum ersten Terminierungszeichen aus.
Hmm der Rest ergibt für mich keinen Sinn.
-
Hmm, ist schon komisch, ich verstehe ja jetzt wie du es angegangen währst, aber es geht irgendwie einfach nicht..
Es muss doch eine andere möglichkeit geben, das letze zeichen zu entfernen bzw nicht auszugeben!?
-
Hmm ja gibt es schön aber das ist irgendwie nicht so toll.
for(int i=1;i<(strlen(text)-1);i++) printf("%c",text[i]);
-
Nagut, mit meinen selbst reingeschirbenen variablen hat das ja jetzt noch funktioniert..
Aber irgendwie mit den argumenten klappt es nciht so ganz
Ich hab das ganze jetzt so:#include <stdio.h> #include <stdlib.h> #include <string.h> void cuts(char *text){ text+=1; printf("%s", text); } void cute(char *text){ int i; printf(" "); for(i=0;i<(strlen(text)-1);i++) printf("%c",text[i]); } int main(int argc, char *argv[]) { if( argc == 2 && argv[2] == '/?' ) printf("\nSUBECHO [String]\n\n Gibt einen string der aus\n mindestens 2 woertern bestehen\n muss ohne sein erstes und letztes\n zeichen aus.\n\n"); else if( argc < 3 ) printf("Fehler! Es muessen mindestens 2 woerter uebergeben werden! /? fuer hilfe..\n"); else { int i, x; argc--; cuts(argv[1]); for(i=2; i<argc; i++) printf(" %s", argv[i]); cute(argv[argc]); } return 0; }
UNd zum aufrufen hab ich dann folgendes batch:
@echo off SUBECHO "Das ist ein Test mit vielen woertern" PAUSE SUBECHO "Mit Zwei" PAUSE
Das resultat sieht jedoch so aus:
Fehler! Es muessen mindestens 2 woerter uebergeben werden! /? fuer hilfe.. Drücken Sie eine beliebige Taste . . . Fehler! Es muessen mindestens 2 woerter uebergeben werden! /? fuer hilfe.. Drücken Sie eine beliebige Taste . . .
Jemand ne idee, wo der fehler von mir ist?
-
Hallo,
probiers mal mit
SUBECHO Das ist ein Test mit vielen woertern
Ohne die ".
-
Also meine Funktion zum Kürzen des Strings würde so aussehen:
char * delfirstlast(char * text) { text[strlen(text)-1] = 0; //letztes Zeichen entfernen strcpy(text, text+1); //erstes Zeichen entfernen return(text); //gekürzten String zurückgeben }
MC_Breit schrieb:
if( argc == 2 && argv[2] == '/?' )
Genau in dieser Zeile liegt der Fehler. In '' darf nur ein Zeichen stehen. Und wenn man Strings vergleichen will, dann bringt == nichts. Das muss z. B. mit strcmp() gemacht werden!