使用fgets()常會遇到一個問題,輸入的字元數目超過Buffer給定的,就會出現下列的狀況。

狀況:當程式為 fgets( cName, 30, stdin ); 時,輸入超過30 個字元,程式就會每次輸出30個字元直到全部資料被輸出。下列為此種現象程式碼及狀況示意圖 :

#include <stdio.h>
#include <string.h>
int main()
{
    char cName[30];
    FILE *pFile;

    pFile = fopen( "write.csv", "a" );
    if( pFile == NULL )
    {
        printf("open failure");
        return 1;
    }
    while(1)
    {
        printf("please enter your name: \n");
        fgets( cName, 30, stdin );
        if( 'E' == cName[0] && ('\n' == cName[1] || '\0' == cName[1] ))
        {
            break;
        }

        fwrite(cName, 1, strlen( cName ) , pFile);
        memset( cName, 0x00, sizeof( cName ) );

    }
    fclose(pFile);
    return 0;
}
                                                                                           

 

1 

2  

這時若多出來的資料,使用者不用需要捨棄,則程式碼改成如下 :

#include <stdio.h>
#include <string.h>
int main()
{
    char cName[30];
    FILE *pFile;

    pFile = fopen( "write.csv", "a" );
    if( pFile == NULL )
    {
        printf("open failure");
        return 1;
    }
    while(1)
    {
        printf("please enter your name: \n");
        fgets( cName, 30, stdin );
        if( strchr(cName, '\n') == 0 )
        {
            while(fgetc(stdin)!='\n');
            cName[29] = '\n';
        }   
        if( 'E' == cName[0] && ('\n' == cName[1] || '\0' == cName[1] ))
        {
            break;
        }   

        fwrite(cName, 1, strlen( cName ) , pFile);
        memset( cName, 0x00, sizeof( cName ) );

    }
    fclose(pFile);
    return 0;
}

 就會變成超過的,就忽略不要囉。

3  

3  

arrow
arrow

    S 發表在 痞客邦 留言(0) 人氣()