繁体   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