2017-08-30 60 views
0
FILE *fp; 

fp = fopen(filen, "wb"); 

const char tok[2] = ","; 
char str[340]; 

while (fgets(str, 340, stdin) != NULL) 
{ 
    struct test loadTest; 
    printf("You entered: %s", str); 
    strncpy(loadTest.level, strtok(str, tok), 20); 
    strncpy(loadTest.first, strtok(NULL, tok), 30); 
    fwrite(&loadTest, sizeof(struct test), 1, fp); 
} 

fclose(fp); 

您好所有,分割断块

出于某种原因,我在我的代码得到一个分段错误。

我几乎积极的错误是在上面的小代码块内的某处(因为这是所有我修改为seg故障),但我似乎无法查明它。

我知道分段错误与访问内存有关,我不应该访问,但我不知道我在哪里做代码。

任何帮助将不胜感激!

+2

你试图调试代码? – hrust

+4

你确定令牌的长度被固定为指定的20和30吗? – Lemonov

+0

你在哪里检查你是否成功打开了输出文件? –

回答

-1

你的代码中的几点改进

  • fopen读前检查结果/写入文件
  • 初始化变量使用它们的值
  • 使用sizeof代替常数(如在评论中提到的)
  • strtok()可以返回NULL并且这个必须检查(见here为什么)
  • you mus T选用strncpy()小心,因为你的代码的this

下面是修改后的版本

FILE *fp; 

fp = fopen(filen, "wb"); 

if (fp == NULL) 
{ 
    printf("Error opening file: %s", filen); 
} 
else 
{ 

    const char tok[2] = ","; 
    char str[340]; 

    while (fgets(str, sizeof(str), stdin) != NULL) 
    { 
     struct test loadTest; 
     char *level; 
     char *first; 
     memset(&loadTest, 0, sizeof(loadTest)); 
     printf("You entered: %s", str); 
     level = strtok(str, tok); 
     if (level == NULL) 
     { 
      continue; // bad input ? 
     } 
     first = strtok(NULL, tok); 
     if (first == NULL) 
     { 
      continue; 
     } 
     strncpy(loadTest.level, level, sizeof(loadTest.level)-sizeof(char)); 
     strncpy(loadTest.first, first, sizeof(loadTest.first)-sizeof(char)); 
     fwrite(&loadTest, sizeof(loadTest), 1, fp); 
    } 

    fclose(fp); 
} 
+0

这些都是改进,但不认为他们会阻止seg故障。张贴他们像评论。 – i486

+0

@ i486我需要发表评论吗?在发布答案之前,我已经在问题中添加了评论。我认为segfault出现,因为该文件未成功打开。 'fopen'之后'fp'为NULL。 –

+0

你只能怀疑'fopen'是问题所在。这不是100%肯定=>解决方案是评论,这不是答案。 – i486