今天寫程式時卡位了,最主要是沒弄清楚sizeof()與strlen()的使用時機,後來問了jashliao,點通了我這小嫩咖,所以稍加記錄

而今天的主要情形是我使用C開檔,並寫入一段文字,儲存後離開,但去開檔看文字有寫入但後面多了一些亂碼,像是^@

程式碼如下

#include <stdio.h>
#include <string.h>
int main(){
 char sbuf[512];
 FILE *pFile;
 sprintf(sbuf, "%s%s%s", "aaa", "aaa", "aaa");
 pFile = fopen("filename.txt","w" );
 if( NULL == pFile ){
                printf( "open failure" );
                return 1;
        }else{
                fwrite(sbuf,1,sizeof(sbuf),pFile);
                fclose(pFile);
        }
 return 0;
}

而開啟檔案裡的內容會像下面,前面九個a是正確的,但後面多了很多的亂碼

aaaaaaaaa#▒`=▒0▒#▒▒=▒ ▒#▒▒n      .N=▒▒▒* x       ▒▒#▒(▒▒▒▒#▒▒▒▒8▒▒▒▒#▒▒+ ▒* ▒▒* ▒@x▒▒@X▒#▒0▒#▒▒*  + ▒+ ▒y        ▒* ▒+  + ▒▒#▒▒▒#▒.N=▒▒@▒▒▒▒▒▒#▒▒▒▒▒▒* ▒+ ▒@▒#▒r

最後是把sizeof(sbuf)改成strlen(sbuf),輸出就正常了

修改後的程式碼如下

#include <stdio.h>
#include <string.h>
int main(){
 char sbuf[512];
 FILE *pFile;
 int len;
 sprintf(sbuf, "%s%s%s", "aaa", "aaa", "aaa");
 len=strlen(sbuf);
 printf("%d",len);
 pFile = fopen("filename.txt","w" );
 if( NULL == pFile ){
                printf( "open failure" );
                return 1;
        }else{
                fwrite(sbuf,1,strlen(sbuf),pFile);
                fclose(pFile);
        }
 return 0;
}

其中還加了len=strlen(sbuf)再把len印出來printf("%d",len),確定strlen(sbuf)是9

結論是如果使用sizeof()因為程式不知道你要在那裡停,所以它就整個buffer把它印出來

如果你是使用strlen(),那麼長度在本例就是9,所以它只印9個字,後面那些拉裡拉雜的就不會來湊熱鬧了.

arrow
arrow
    文章標籤
    c語言 sizeof strlen
    全站熱搜
    創作者介紹
    創作者 痞客興 的頭像
    痞客興

    痞客興的部落格

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