Zeiger auf Felder
-
Hallo,
wir sollten in einen C-Programm eine Zeichenkette über die Funktion gets() einlesen, die Vor-und Nachname getrennt von einen Leerzeichen enthält. Wir sollten Zeiger verwenden um die Stelle des Leerzeichens in der Zeichenkette zu ermitteln. Nun soll über Zeiger der Vor-und Nachname in zwei getrennte Zeichenkette kopiert werden und mit printf ausgegeben werden.
Mein unten stehendes Programm gibt leider komische Zeichen aus. Ich glaube mein Fehler liegt bei den Zeigern,aber wo?
Für euere Hilfe schon besten Dank im Vorraus.
#include <stdio.h>
#include <conio.h>void main()
{
char name[20];
char vname[20];
char nname[20];
char* ptr=name;
char* ptr1;
char* ptr2;
int i,a;printf("Geben Sie ihren Vornamen und Nachnamen ein: ");
gets(name);for(i=0;i<20;i++)
{
ptr=&name[i];
if(*ptr==' ') break;
}i=0;
ptr1=&name[0];
for(ptr1=name;*ptr1=!*ptr;ptr1++)
{
*ptr1=vname[i];
i=i+1;
}a=0;
ptr=&name[19];
ptr2=&name[i];
for(ptr2=ptr1;ptr2==ptr;ptr2++)
{
*ptr2=nname[a];
i=i+1;
a=a+1;
}printf("\nVorname: %s ", vname);
printf("\nNachname: %s ", nname);getch();
}
-
Du hast mehrere Fehler.
- Sag deinem Lehrer dass du dich weigerst, gets zu benutzen. Schau dir stattdessen fgets an.
- for(ptr1=name;*ptr1=!*ptr;ptr1++)
Der Ungleichheitsoperator heißt != , =! wird als 2 getrennte Operatoren, Zuweisung und boolsche Negation, interpretiert. Zum anderen bezweifle ich, dass du die Inhalte der Zeiger vergleichen wolltest (es müßte trotzdem zufällig klappen, da *ptr ein Leerzeichen ist) - *ptr1=vname[i];
Zuweisungen funktionieren so, dass der linken Seite der Wert der rechten Seite zugewiesen wird. Du glaubst anscheinend es sei andersherum. - diverse grausame Programmierstilfehler, die ich jetzt nicht raussuche, da du irgendwann wahrscheinlich von selbst besser verstehen wirst, wie alles funktioniert.
-
Vielen Dank für die schnelle Hilfe und deine nützlichen Tipps.
Bei Punkt 2 sollte wirklich auf ein Leerzeichen überprüft werden!
Also ich habe jetzt alles verbessert, aber der Computer gibt noch immer nicht das richtige aus, es kommt nur verdammt nahe! In vname soll der vorname/in nname der nachnamne stehen! Kannst du bitte noch mal drüberschauen?
Und übrigens besitzen wir leider keinen Programmierstil, da unser Lehrer unfähig ist. Naja - Pisastudie
#include <stdio.h>
#include <conio.h>void main()
{
char name[20];
char vname[20];
char nname[20];
char* ptr=name;
char* ptr1;
char* ptr2;
int i,a;printf("Geben Sie ihren Vornamen und Nachnamen ein: ");
gets(name);for(i=0;i<20;i++)
{
ptr=&name[i];
if(*ptr==' ') break;
}i=0;
ptr1=&name[0];
for(ptr1=name;*ptr1!=*ptr;ptr1++)
{
vname[i]=*ptr1;
i=i+1;
}a=0;
ptr=&name[19];
ptr2=&name[i];
for(ptr2=ptr1;ptr2==ptr;ptr2++)
{
nname[a]=*ptr2;
i=i+1;
a=a+1;
}printf("\nVorname: %s ", vname);
printf("\nNachname: %s ", nname);getch();
}
-
Nur so nebenbei, benutze code-Tags
Hier meine Version:
#include <stdio.h> #include <conio.h> void main() { char name[20]; char vname[20]; char nname[20]; char* ptr=name; char* ptr1; char* ptr2; int i,a; printf("Geben Sie ihren Vornamen und Nachnamen ein: "); gets(name); for(i=0;i<20;i++) { ptr=&name[i]; if(*ptr==' ') break; } i=0; ptr1=&name[0]; for(ptr1=name ; ptr1 < ptr ; ptr1++, i++) { vname[i]=*ptr1; } a=0; ptr=&name[19]; ptr2=&name[i]; for(ptr2=ptr1 ; ptr2 <= ptr ; ptr2++) { nname[a]=*ptr2; i=i+1; a=a+1; } printf("\nVorname: %s ", vname); printf("\nNachname: %s ", nname); getch(); }
Da macht er bei mir:
Geben Sie ihren Vornamen und Nachnamen ein: vname nname
Vorname: vname²c
Nachname: nnameWenn ich aber 1234 4321 eingebe macht er
Vorname: 1234(hoch 0)²c
Nachname: 4321Was ist denn noch Falsch
-
Abend,
also wie Bashar schon gesagt hatte, solltet ihr gets unbedingt weglassen, weil -> "Da es unmöglich ist zu sagen, wie viele Zeichen Zeichen gets() lesen wird, ohne die Daten vorher zu kennen und da gets() fortfährt und Daten über das Ende des Puffers hinaus speichert, ist es sehr gefährlich, diese Funktion zu benutzen. Sie wurde benutzt um in Rechner einzubrechen. Benutze fgets() anstatt." (aus der man page von gets)
Wenn ich den Code von quizzmaster ein wenig umbaue, und ein wenig von meinem kleinen C-Wissen einfließen lasse, dann funktionierts.
Hier mein Quellcode:
#include <stdio.h> int main() { char name[20]; char vname[20]; char nname[20]; char* ptr; char* ptr1; char* ptr2; int i,a; printf( "Geben Sie ihren Vornamen und Nachnamen ein: " ); scanf( "%[^\n]s", name ); for( i = 0; i < 20; i++ ) { ptr = &name[ i]; if( *ptr == ' ' ) break; } i = 0; ptr1 = &name[0]; for( ptr1 = name; ptr1 <= ptr; ptr1++, i++ ) vname[ i] = *ptr1; a = 0; ptr = &name[19]; ptr2 = &name[ i]; for( ptr2 = ptr1; ptr2 <= ptr; ptr2++ ) { nname[a] = *ptr2; i++; a++; } printf( "\nVorname ....: %s ", vname ); printf( "\nNachname ...: %s \n\n", nname ); getchar(); return 0; }
Dann wäre da noch was: main sollte immer einen Rückgabewert haben -> daher int main und return. Schau dazu mal in die FAQ, da hatte irgendwer mal nen schönen Beitrag zu geschrieben - glaube es war Shade
[ Dieser Beitrag wurde am 23.03.2003 um 20:06 Uhr von guard editiert. ]
-
OK ich hatte das mit gets(); nicht mehr verändert, dass liegt aber daran, dass ich noch Latein Vokabeln lernen musste üarg konnte aber alle , weil ich vorher tagelang üben musste
-
schreibt den Code doch nicht ab. Das kann man eleganter vor vorn in 10-15 Zeilen schreiben.
-
Danke für eure Antworten.
Habe das Prog von Guard gestartet. Wenn ich nun zB. Karl Meier eingebe, bringt das Prog:
Vorname....: Karl |||||||||||| Karl Meier
Nachnahme..: Meier
richtig sollte es aber so sein:
Vorname....: Karl
Nachnahme..: Meier
vielleicht findet einer von euch noch den fehler. Nochmals besten Dank für die bisherige Hilfe und viele Grüße
Jens
-
ich würde das so machen
#include <string.h> #include <stdio.h> int main(void) { fputs("Namen und Vornamen eingeben: ",stdout); char buffer[100]; fgets(buffer,100,stdin); size_t i=0; for(;buffer[i]&&buffer[i]!=' ';++i); char nachname[i]; memcpy(nachname,buffer,i); nachname[i]=0; size_t n=strlen(buffer+i+1); char vorname[n]; memcpy(vorname,buffer+i+1,n); vorname[n-1]=0; printf("nachname: %s vorname: %s\n",nachname,vorname); return 0; }
oder mit der Hilfe von strtok
#include <string.h> #include <stdio.h> int main(void) { fputs("nachname vorname eingeben: ",stdout); char buffer[100]; fgets(buffer,100,stdin); char nachname[100]; strcpy(nachname,strtok(buffer," ")); char vorname[100]; strcpy(vorname,strtok(NULL," ")); printf("nachname: %s vorname: %s",nachname,vorname); return 0; }
-
Hallo,
ich hab da auch mal was gebastelt:
#include <stdio.h> int main() { char name[40]; char vname[20]; char nname[20]; char *n = name; char *vn = vname; char *nn = nname; fgets(name,38,stdin); while(*n != ' ') *(vn++) = *(n++); n++; *vn='\0'; while (*n) *(nn++)=*(n++); *nn = '\0'; printf( "\nVorname ....: %s ", vname ); printf( "\nNachname ...: %s \n\n", nname ); return 0; }
@ kingruedi
was macht eigentlich die Zeile "char nachname[i];"? Irre ich mich, oder geht das doch gar nicht.grüße Con@n
[ Dieser Beitrag wurde am 23.03.2003 um 23:13 Uhr von Con@n editiert. ]
-
Original erstellt von guard:
also wie Bashar schon gesagt hatte, solltet ihr gets unbedingt weglassen, weil -> "[i]Da es unmöglich ist zu sagen, wie viele Zeichen Zeichen gets() lesen wird, ohne die Daten vorher zu kennen und da gets() fortfährt und Daten über das Ende des Puffers hinaus speichert, ist es sehr gefährlich, diese Funktion zu benutzen.und was machst du? verwendest scanf wie gets mit allen nachteilen und keinen vorteilen (nur n kleiner overhead zusätzlich)
-
Original erstellt von Shade Of Mine:
und was machst du? verwendest scanf wie gets mit allen nachteilen und keinen vorteilen (nur n kleiner overhead zusätzlich)Mal ganz smooth bitte ... erstens war das nur ne Demonstration wie man es hätte machen können (btw: lief das Programm bei mir genau wie es sollte); 2. hätte ich das ganze Programm anders aufgebaut und 3. ... das Argument überleg ich mir noch ...
-
was macht eigentlich die Zeile "char nachname[i];"? Irre ich mich, oder geht das doch gar nicht.
wilkommen in der Zeit des C99 Standards:
seit dem C99 Standard ist das erlaubt und der GCC kompiliert das auch mit -std=c99 hervorragend
-
Original erstellt von Con@n:
was macht eigentlich die Zeile "char nachname[i];"? Irre ich mich, oder geht das doch gar nicht.Doch es geht schon; es deklariert ein Feld vom Typ char mit i Einwohnern und zerstört es am Blockende wieder.
#include <stdio.h> #include <string.h> int main(void) { char buf[100]; char *p; if (!fgets(buf, sizeof buf, stdin)) return 1; if (p = strchr(buf, ' ')) { *p = '\0'; /* wenn kein Schreibzugriff erwünscht, dann die Differenz bestimmen und mit fwrite ausgeben; _nicht_ wild rumkopieren! */ ++p; printf("Vorname %s, Nachname %s\n", buf, p); } else /* Kein Name */; return 0; }
Oder ohne Felder:
#include <stdio.h> int main(void) { int c; fputs("Vorname ", stdout); while ((c = getchar()) != EOF) { if (c == ' ') fputs(" Nachname", stdout); putchar(c); } return 0; }
/me hat gerade nichts zu tun :).