[英]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
(數組限制),這就是您遇到分段錯誤的時候。 (不過可以使您擺脫無限循環!)
其他事宜:
fscanf(fp,"%s",wc);
現在,如果非空格字符序列大於9
字符怎么辦? fscnaf
將存儲該序列和末尾的\\0
字節,覆蓋緩沖區wc
(大小為10,記得嗎?)
為避免緩沖區溢出,請始終將maximum field width
與%s
。 例如
fscanf(fp,"%9s",wc);
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.