2017-01-22 1 views
0

Wir haben dieses Programm in der Universität erstellt, das eine Reihe von Zeichen nach Adresse in der Sprache c erstellt. aber das erste Element (char * str) gibt einen seltsamen Raum aus. Ich habe einige Tutorials über Arrays von Zeichen gesehen, bei denen das erste Element das erste Zeichen ist, das wir eingegeben haben.Sprache c char * beginnt mit dem zweiten Element statt zuerst

also warum passiert das? sind ihre Situationen, in denen das passiert? wenn ja, wie kann ich wissen, ob meine string vom ersten oder zweiten element ausgeht, ohne printf jedes mal zu benutzen?

Das ist mein Programm

#include<stdio.h> 
#include<stdlib.h> 

char* newStr(int n); 
int length(char* str); 

int main() { 
int n,i; 
printf("Number of characters \n"); 
scanf("%d",&n); 
char* str = newStr(n); 
char* c = malloc(n*sizeof(char)+1); 
c=str; 

// check that c[0]=' ' and c[n+1]=\0 
for(i=0;i<=n+1;i++) printf("*(str+%d) = %c \n",i,*(c+i)); 

return 0; 
} 

char* newStr(int n) { 
int i; 
char* c; 
c=malloc(n*sizeof(char)+1); 
printf("Enter a word of %d characters \n",n); 
for(i=0;i<=n;i++) {scanf("%c",(c+i));} 
*(c+n+1)='\0'; 
return c; 
} 

int length(char* str) { 
int i=0; 
while(*(str+i)!='\0'){i++;} 
return i-1; 
} 

und dies ist der Ausgang

Number of characters 
5 
Enter a word of 5 characters 
hello 
*(str+0) = 

*(str+1) = h 
*(str+2) = e 
*(str+3) = l 
*(str+4) = l 
*(str+5) = o 
*(str+6) = 
The length of your string is 5 

es mir jemand in einfachen termes erklären kann, wie ich auf c ganz neu bin. Vielen Dank im Voraus

+0

'scanf ("% d", &n);' nicht Nimm das nachgestellte Newline-Zeichen, das vom nächsten 'scanf' gelesen wird. – kaylum

+1

... nach dem' scanf ("% c", (c + i)); 'eventuell' scanf sein muss ("% c" , (c + i)); 'mit diesem Platz darin, führende Whitespace zu verbrauchen (die meisten anderen Formatspezifikationen machen das automatisch, aber nicht'% c'). 'scanf' ist ohnehin knifflig und wird am besten vermieden. –

+0

Ich lege ein' scanf ("% c", c); 'vor der Schleife fügte dann den Anfangswert von Ich bei 1. Jetzt funktioniert es. danke – user7454975

Antwort

0

Jemand hat bereits in den Kommentaren geantwortet, dass die scanf() - Funktion das nachfolgende Zeilenumleitungszeichen nicht konsumiert.

Wenn also der Benutzer auf seiner Tastatur "Enter" drückt und dann ein scanf() in Ihrem Code erscheint, wird dieser Enter press aufgenommen.

Auch ich möchte Ihre Aufmerksamkeit in der newStr() -Funktion konzentrieren. Dort reservieren Sie Platz für eine neue Zeichenfolge und speichern sie in einem dynamischen Array von Zeichen, Ihrem char * c, und geben dann diesen Zeiger zurück.

Aber in Ihrem main() speichern Sie den Rückgabewert in str und aus irgendeinem Grund versuchen, es auf einen anderen Zeiger zu kopieren (und es übrigens falsch machen)?

char* str = newStr(n); 
char* c = malloc(n*sizeof(char)+1); 
c=str; 

str ist bereits eine Zeichenfolge, die Sie keine Notwendigkeit verwenden, eine andere malloc auf char * c zu machen. Und wenn Sie schreiben c = str; Sie zuweisen tatsächlich den char * c die Adresse von str, nicht die von str wiesen Werte, so dass diese Codezeile zu machen:

char* c = malloc(n*sizeof(char)+1); 

völlig nutzlos und fehleranfällig, da Sie nicht in der Lage sein werden, befreie den Zeiger, nachdem du die Adresse verloren hast.

Ich weiß nicht, ob ich klar war ...

+1

danke das war super klar.Also ist das erste Zeichen dasselbe, das ich eingegeben habe, das Problem war mit scanf und jetzt habe ich es mit einem 'scanf ("% c ", c);' vor der Schleife dann den Anfangswert von i um 1 hinzugefügt. don Jetzt, wenn es die praktischste Lösung ist, aber es funktioniert. und du hast recht, dass char * c nutzlos ist – user7454975

0

Wie bereits erwähnt, scanf("%d",&n) nicht die Zeilenendmarke verbrauchen, aber scanf("%d\n",&n) Willen.

BTW, nur einen kurzen zu präsentieren (aber wahrscheinlich Hacky) Ansatz, der anstelle von fest einprogrammiert 20scanf("%20s",...), aber mit variabler Breite Spezifizierer verwendet:

int n; 
char format[20]; 
scanf("%d\n",&n); 
char *result = malloc((n+1) * sizeof(char)); 
sprintf(format, "%%%ds", n); 
scanf(format, result); 
Verwandte Themen