String kürzen..
-
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!