2017-03-10 4 views
0

Ich schrieb ein einfaches Programm, um eine Zeichenfolge zu lesen.Eine Zeichenfolge von stdin in c lesen

void main() 
{ 
    char *str; /*didn't allocate memory*/ 
    scanf(" %s",str); 
    printf("%s",str); 
} 

Aber es verursacht einen Segmentierungsfehler. Wohingegen der nächste nicht ist.

void main() 
{ 
    char *str; 
    scanf(" %c",str); 
    printf("%c\n",str); 
} 

Würde es jemandem etwas ausmachen zu klären, wie das eigentlich funktioniert?

+7

Lokale nicht statische Variablen haben einen * unbestimmten * Wert. Wenn Sie eine solche Variable haben, die ein Zeiger ist, und Sie es dereferenzieren, haben Sie * undefiniertes Verhalten *. Es gibt oft keine Möglichkeit vorherzusagen, was passieren wird. –

+0

Aus Neugier habe ich dein zweites Programm kompiliert und ausgeführt. Es ist auch abgestürzt. Undefiniertes Verhalten kann sich auf verschiedenen Computer-, Betriebssystem- und Compiler-Kombinationen unterschiedlich manifestieren. –

+3

"Würde es jemandem etwas ausmachen zu klären, wie das eigentlich funktioniert?" - * es nicht *; es ruft * undefiniertes Verhalten * auf. Du wurdest in eine weiche Idee des Erfolges eingelullt, weil du die Definition von "Arbeiten" so zu sein scheinst, dass das Programm einfach "nicht abstürzt". Fehlerhafte Programme, die ein undefiniertes Verhalten auslösen, können das sicher (oder auch nicht) tun, und wenn Sie * unglücklich * sind, können sie sogar * erscheinen *. Könnte schlimmer sein. Es könnte für Sie "gearbeitet" haben und nicht Ihr Ausbilder, Arbeitgeber oder schlimmstenfalls Kunde. – WhozCraig

Antwort

0

Ihre Zeichenfolge ist nicht zugeordnet. was bedeutet, dass du irgendwo schreibst, wo du nicht gefragt hast.

aber was können Sie tun, ist:

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

int main(int argc, char *argv[]) 

{ 
    char c; 
    while (scanf("%c",&c) && c != '\n') 
    printf("%c",c); 
    printf("\n"); 

    return 0; 
} 

Es wird alle Zeichen lesen Sie in der Eingabe senden, bis Sie die Eingabetaste drücken.

+0

' getchar' wäre viel natürlicher als 'scanf'. Wenn Sie scanf verwenden, denken Sie daran, dass es EOF, nicht 0, auf eof zurückgibt, und EOF ist ein "wahrer" Wert. Schließlich überspringt das Leerzeichen nicht. – rici

+0

, weil es nicht zum Überspringen von Leerzeichen gedacht ist. Warum möchtest du die Zwischenräume zwischen den Wörtern überspringen? –

+1

Aus welchen Gründen auch immer. Das OP verwendet ein Leerzeichen als erstes Zeichen der 'scanf'-Formate, und die Aktion besteht darin, Leerzeichen zu überspringen, sodass der von Ihnen vorgeschlagene Code nicht gleichwertig ist. – rici