2016-10-30 106 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的工作:*** ***棧//嘗試打印字符

: 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) 

由於C數組使用基於0的索引。

這就是說,按照C11,章7.21.5.2

如果stream點到輸出流或其中最近 操作未輸入的更新流,所述fflush函數導致任何未寫入數據將該流 傳遞到主機環境以寫入文件; 否則,行爲是未定義的 。

所以,不要做fflush(stdin),在技術上,它調用undefined behavior

最後,scanf("%s",a);爲緩衝區溢出打開潛在。限制輸入緩衝區的長度,如

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