簡體   English   中英

C中字符串復制函數strcpy中的分段錯誤

[英]Segmentation fault in String copy function strcpy in C

#include<stdio.h>
#include<string.h>
int main()
{
    char temp[4][10],wc[10];
    int i=0,j;
    FILE *fp;
    fp=fopen("ip.txt","r");
    fscanf(fp,"%s",wc);
    while(strcmp(wc,"\n"))
    {
        strcpy(temp[i],wc);
        fscanf(fp,"%s",wc);
        i++;
    }

    for(j=0;j<i;j++)
    {
        printf("%s",temp[j]);
    }
}

輸出: segmentation fault(core dumped)

ip.txt包含:

LOOP ADD AREG,A
 SUB B,A

錯誤在哪里?

我的朋友們,在看完您的問題后,發現您在程序的最后循環中將j錯誤地寫入了i 對於i == 4 ,數組temp[]將越過邊界,這將導致分段錯誤。處理的方法是在最終循環中將i替換為j,並用strcmp(wc,"\\n")永遠不會在第一個循環中變為0,因此temp[]也將越界。老實說,我建議您下次在問題中寫下願望。將wc復制到其中的元素也很危險。指針數組,尤其是在為它們分配空間之前,這也是導致分段錯誤的原因。

fscanf(fp,"%s",wc);    

%s將匹配非空格字符序列,並將該序列存儲在wc 現在,由於\\n 空格字符,因此此調用將忽略它!

所以wc永遠不會等於\\n

因此, while(strcmp(wc,"\\n")是無限循環,因為strcmp永遠不會返回0 (即使到達文件ip.txt的末尾!)

i++語句將使i大於4 (數組限制),這就是您遇到分段錯誤的時候。 (不過可以使您擺脫無限循環!)


其他事宜:

  1. fscanf(fp,"%s",wc);
    現在,如果非空格字符序列大於9字符怎么辦? fscnaf將存儲該序列末尾的\\0字節,覆蓋緩沖區wc (大小為10,記得嗎?)
    為避免緩沖區溢出,請始終將maximum field width%s 例如

     fscanf(fp,"%9s",wc); 
  2. fp=fopen("ip.txt","r");
    現在您怎么知道fopen成功了? 使用fp進行任何處理之前,請務必先檢查fp是否為NULL ,例如

     if(fp=fopen("ip.txt","r")) { //`fp` code goes here } else printf("fopen failed!\\n"); 

解:
您沒有提到,但是如果您的目標是將一行中的單詞存儲在數組temp ,請進行處理,然后再次將下一行中的單詞存儲在數組temp則可以使用fgets()來獲取一行在緩沖區中。 然后使用sscanf()從該緩沖區檢索每個單詞以將它們存儲在temp數組中。

就像是:

char buffer[50], temp[4][10], *buf, *wc;
int i;

while(fgets(buffer, 50, stdin) != NULL)
{
    i = 0;
    buf = buffer;
    while((wc = strtok(buf, " \n")) && (i < 4))
    {
        strcpy(temp[i++], wc);
        if (buf && i)
            buf = NULL;
    }

    // process words here

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM