2016-10-30 3 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); 
} 

Так дело в том, я хочу, чтобы напечатать символ с следующим символом в таблице ASCII , но каждый раз, когда я бег это я получить эту ошибку, хотя это, кажется, работает с размером 10:*** Stack smasing обнаружен *** // Попытка печати полукокса

: 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);' UB. –

+1

WTF является '__fpurge'? – melpomene

ответ

3

говоря

while(i<=10) 

вы off-by one. Это должно быть

while(i < 10) 

as C массивы используют индексирование на основе 0.

Тем не менее, в соответствии с C11, глава 7.21.5.2

Если stream указывает на выходной поток или поток обновлений, в котором самая последняя операция не была ввода, функция fflush вызывает какие-либо данные неписаную для этого потока для доставки в среду хоста, которая должна быть записана в файл; иначе, поведение undefined.

Так что, не делать fflush(stdin), технически, это вызывает undefined behavior.

И наконец, scanf("%s",a); открывает потенциал для переполнения буфера. Ограничьте длину входного буфера, например

scanf("%9s",a); //when a is an array of size 10 
Смежные вопросы