2016-10-30 9 views
0
#include <stdio_ext.h> 
#include <stdlib.h> 
int main() 
{ 
    char a[10],c[10]; 
    int i,b; 

    b=1; 
    i=0; 

    printf(": "); 
    scanf("%s",a); 
    fflush(stdin); 
    __fpurge(stdout); 

    while(i<=10) 
    { 

    c[i]=a[i]+b; 
    i++; 

    } 
    printf("%s",c); 
    return (EXIT_SUCCESS); 
} 

Also die Sache ist, ich ein Zeichen mit dem nächsten Zeichen in der ASCII-Tabelle , drucken möchten, aber jedes Mal, wenn ich es ich laufen erhalten diesen Fehler, obwohl es mit einer Größe von 10 scheint zu funktionieren:*** Stapel smasing erkannt *** // versucht, ein Zeichen zu drucken

: asdf 
*** stack smashing detected ***: /home/polo/Escritorio/ejemplo/dist/Debug/GNU-Linux/ejemplo terminated 
bteg� c8�l�#w�@��� 
RUN FINISHED; Aborted; core dumped; real time: 4s; user: 0ms; system: 0ms 
+2

'fflush (stdin);' ist UB. –

+1

WTF ist '__fpurge'? – melpomene

Antwort

3

Indem man sagt,

while(i<=10) 

du bist off-by one. Es sollte

while(i < 10) 

sein, da C-Arrays 0-basierte Indizierung verwenden.

Das heißt, gemäß C11 Kapitel 7.21.5.2

Wenn stream Punkte zu einem Ausgangsstrom oder einer Aktualisierungsstrom, in dem die jüngste Betrieb nicht eingegeben wurde, die Funktion jedes fflush ungeschriebenen Daten verursacht für diesen Datenstrom an die Host-Umgebung geliefert werden, um in die Datei geschrieben zu werden; andernfalls ist das Verhalten undefined.

Also, nicht fflush(stdin) tun, technisch gesehen, ruft es undefined behavior.

Schließlich öffnet scanf("%s",a); das Potenzial für Pufferüberlauf. Begrenzen Sie die Eingangspufferlänge wie

scanf("%9s",a); //when a is an array of size 10