strlen implementation
-
Hi leute!
Das hier ist mein erster Beitrag hier, also erstmal Hallo allerseits und auf gute Kooperation
Also habe ein kleines Problem, und zwar möchte ich eine Shell unter Linux realisieren. Naja, um genau zu sein, ist dies ein Heimprojekt das in etwa 2 Wochen fertig muss sein. Um natürlich so flexibel und unabhängig vom System (auf welchem das Programm laufen soll) zu sein, muss die Anzahl der include-Dateien minimal sein, da man ja nicht sicher sein kann ob dieser Dateien auf dieser Maschine existieren oder nicht. Daher muss man also die Funktionen die man benötigt selbst implementieren. Dies hab ich jetzt auch gemacht mit der strlen() funktion(welche bei mir halt einfach length heisst
)
Folgende Implementation für die Funktion length(char *string)
int length(char *string) { int sum=0; while (string[sum++]!='\0'); return sum; }
So weit, so gut, dache ich mir
Allerdings gibt mir die funktion den Wert "13" für den string "b" sowie für alleanderen möglichen Werte zurück.
Ich bin etwas verwirrt, da die Implementation mir eigentlich recht logisch vorkommt.
Hoffe auf schnelle Antworten,
danke im Voraus!
-
Hallo bloggi
lies mal hier
http://www.c-plusplus.net/forum/viewtopic-var-t-is-124532.html
dort gibt es etwas über Zeiger und ein Beispiel für strlen implementation
Gruß
DancingAntS
-
Hah! Super danke! Ich hab mir das Beispiel programm angesehen und, joa scheint mir klar. Einfach solange suchen bis '\0' gefunden wurde, und dann die gefundene Adresse-Anfangsadresse rechnen. Recht einfach, allerdings müsste ja dann auch meine Version funktionieren, oder etwa nicht? ich setz nachher mal die Funktion aus dem Beitrag in mein Programm ein, hoffentlich funktioniert das Ganze dann
-
bei deinem test muss etwas falsch laufen. dein code ist nicht soo falsch. du musst allerdings 1 von sum abziehen, bevor du es zurückgibst, da du die '\0' derzeit noch mitzählst und damit "" die länge 1 hat. wie du auf 13 kommst, weiß ich nicht. kann es sein, dass dein test dir 1 und 3 ohne leerzeichen dazwischen ausgibt?
-
Heya namenlos.
Also, Ich habe mittlerweile die Fehlerquelle gefunden. Der Grund dafür dass mir die Funktion andauernd 13 zurückgab war ganz einfach ein Fehler im appellierenden Programm, wo ich unabsichtlich 2 Variablen vertauscht hatte. Meine (originale) Funktion funktionierd also einwandfrei (natürlich habe ich "return sum" durch "return --sum" ersetzt.
Jetzt habe ich noch eine kleine Frage, die ich mir schon seit Längerem stelle. Da ich ja in meinem Programme keine fertigen Funktionen benutzen darf, ausser die read/write-Funktionen zur Tastatureingabe/bildschirmausgabe, fragte ich mich wie man mit write(..) einen Integer am Bildschirm anzeigen kann. Die Syntax des Befehls um z.B. "hallo welt" am Bildschirm anzuzeigen ist write(STDOUT_FILENO,"hallo welt",10), wobei die 10 einfach die Länge vom String ist. Nun möchte ich aber jetzt Zahlenwerte darstellen, um einfacher Fehlerquellen lokalisieren zu können. Ich muss dazu sagen dass ich die read/write Funktion benutzen soll, ich aber auch andere Funktionen benutzen darf (welche standardmässig in Linux mit drin sind, und auch die Parameter gleich anzeigen 1)
Nochmals Vielen dank für die Mühe und helfende Worte
mit freundlichen Grüssen,
**1**Ich bin mir hierbei nicht sicher. Man sagte mir, dass die Befehle scanf/printf (mit welchen ich anfangs die Benutzerinteraktionen durchführte), die Werte nicht gleich am Bildschirm anzeigen, also anders gesagt dass beim folgenden Programm "Welt" for "Hallo " am Bildschirm angezeigt wird. (Konfirmation?)
... printf("Hallo "); write(STDOUT_FILENO,"Welt",4); ...
-
Die printf Familie puffert die Ausgabe (weil sie mit FILE* arbeitet), bevor sie tatsächlich an die Ausgabe (stdout, stderr, einen anderen filepointer, usw) weitergeleitet werden. Man kann aber mit man: fflush(3) zwingen, dass der Filepointer sofort geschrieben wird (oder beim Vorkommen des \n Zeichens*)
man: write(2) ist ungepuffert, deswegen kommt der Text auch sofort.
* Vergleiche:
printf("Hallo "); write(STDOUT_FILENO, "world\n", 6); printf("Hallo \n"); write(STDOUT_FILENO, "world\n", 6); printf("Hallo "); fflush(stdout); write(STDOUT_FILENO, "world\n", 6);
-
So, also hier geht nix mehr
Ich sitze jetzt hier, mit all den selbstgeschriebenen String-funktionen, allerdings will keine dieser mit Variablen als Parameter funktionieren. Es erscheint also klar, dass beim Aufruf einer Funktion mit einer string-konstante ("Test", z.B.) alles wunderbar funktioniert. Das Problem, logischerweise, ist zurückzuführen zur Texteingabe, wo meiner Meinung nach ein grosses Missverständnis (meinerseits) vorliegt.Zum Einlesen benutze ich die Funktion read (unistd.h). Ich glaube, dass diese Funktion kein Stringabschlusszeichen anhängt ('\0'), da die Funktion length() mir unendlich grosse Werte (nur bei Variablen als Parameter scheinen diese unendlich gross, oder negativ zu sein, da die schleife for (i=0;i<length(variable);i++){...} nie endet) zurückgibt.
functions.c
#include <unistd.h> #include <stdlib.h> int length(char *string) /*gibt Länge von String zurueck*/ { int i=0; write(STDOUT_FILENO,"length",6); while (string[i++]!='\0'); return i-1; } int nSubStr(char *string,char separator) /*gibt Anzahl ';' zurueck*/ { int i=0,n=0; write(STDOUT_FILENO,"nSubStr\n",8); while(i<length(string)) { if (string[i]==separator) { n++; } } return 2; } void StringCopy(char *source,char *dest,int start, int count) { int i; write(STDOUT_FILENO,"StringCopy",10); if (start<length(source) && start+count<=length(source)) { for (i=start;i<count;i++) { dest[i]=source[start+i]; } } } int StringCompare(char *string1,char *string2) { int i; int equal=0; int n1=length(string1); int n2=length(string2); write(STDOUT_FILENO,"StringCompare",13); if (n1==n2) { for (i=0;i<n1;i++) { if (string1[i]!=string2[i]) { equal=1; } } } else { equal=n1-n2; } return equal; } int MaxCmdTaille(char *ligne) { int i,max=0,taille=0; write(STDOUT_FILENO,"MaxCmdTaille",12); for (i=0;i<length(ligne);i++) { if (ligne[i]==';') { if (taille>max) { max=taille; taille=0; } }else { taille++; } } return max; } void SeparerCommandes(char *ligne,char **commandes) { int i=0,cmds=0,k=0; char *commande; commande=malloc(MaxCmdTaille(ligne) * sizeof(char)); write(STDOUT_FILENO,"SeparerCommandes",16); for (i=0;i<length(ligne);i++) { if (ligne[i]==';') { StringCopy(commande,commandes[cmds],1,length(commande)); cmds++; k=0; }else { commande[k++]=ligne[i]; } } }
myshell.c
#include <stdlib.h> #include <unistd.h> #include "functions.h" #include <string.h> #define MAXLIGNE 256 int main(int argc,char **argv){ char *ligne; /*enthälte die Benutzereingabe*/ int nCommandes; char **commandes; /*wird die kommandos separat enthalten*/ int i; int NoExit=1; /*wenn negativ, programm verlassen*/ ligne=malloc(MAXLIGNE*sizeof(char)); while (NoExit>0) { /*Benutzereingabe*/ write(STDOUT_FILENO,"\nmyshell>",9); read(STDIN_FILENO,ligne,MAXLIGNE); /*interprétation de la saisie*/ nCommandes=nSubStr(ligne,';'); commandes=malloc(nCommandes*sizeof(char*)); /*shell core*/ for (i=0;i<nCommandes;i++) { if (NoExit>0) { if(StringCompare(commandes[i],"exit")!=0) /*solange "exit" nicht eingegeben wurde*/ { system("ls"); }else /*wenn "exit" eingegeben wurde*/ { NoExit=-1; /*programm beenden*/ } } } } return 0; }
Wenn irgendwelche weiteren Fragen sind um mir weiterhelfen zu koennen, bitte einfach nur fragen!
Kommentare,hilfen und ratschläge sind alle Willkommen!
Danke nochmals im Voraus..
mit freundlichen Grüssen..