[英]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.