首页
社区
课程
招聘
[旧帖] [求助]C 程序错误 0.00雪花
发表于: 2012-6-20 16:23 1240

[旧帖] [求助]C 程序错误 0.00雪花

2012-6-20 16:23
1240
今天用C写了一个读取文件的代码,但是总是出错。实在是找不到解决办法了,贴出来让大奖帮忙指点指点:


#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

int main(void)
{  
  char *file_name[] = 
  {    
    "test1.c",
    "test2.c",
  };

  FILE *new_fp = NULL;
  new_fp = fopen("newfile.txt", "w+");
  if (NULL == new_fp)
  {
    printf("Crear new file error!\n");
    return -1;
  }
  
  char *file_msg = NULL;
  file_msg = (char *)malloc(40960);
  if (NULL == file_msg)
    return -1;

  char *new_file_msg = NULL;
  new_file_msg = (char *)malloc(40960);
  if (NULL == new_file_msg)
    return -1;

  char *p_src = file_msg;
  char *p_dst = new_file_msg;

  int i = 0;
  while(NULL != file_name[i])
  {
    memset(file_msg, '\0', 40960);
    memset(new_file_msg, '\0', 40960);

    FILE *fp = NULL;
    fp = fopen(file_name[i], "r");
    if (NULL == fp)
    {
      printf("Open file :%s error!\n",file_name[i]);
      return  -1;
    }

    fread(file_msg, 1, 4096, fp); 

    while(NULL != file_msg)
    {
      if (NULL == (file_msg + 1))
        break;

      if (('/' == *file_msg) && ('/' == *(file_msg + 1)))
      {/*本行后面全部为注释*/
        while ('\r' != *file_msg)
          file_msg++;

        file_msg += 2;
      }
      else if (('/' == *file_msg) && ('*' == *(file_msg + 1)))
      {/*注释符号开始*/
        file_msg += 2;

        while (!strncmp(file_msg, "*/", 2))
          file_msg++;

        file_msg += 2;
      }
      else if (('\r' == *file_msg) && ('\n' == *(file_msg + 1)))
      {/*到达行尾*/
        file_msg += 2;  
      }
      else
      {//真实有效数据
        *new_file_msg = *file_msg;
        new_file_msg++;
        file_msg++;
      }
    }

    file_msg = p_src;
    new_file_msg = p_dst;
    fwrite(new_file_msg, strlen(new_file_msg), 1, new_fp);

    fclose(fp);
    i++;
  }

  free(new_file_msg);
  free(file_msg);
  file_msg = NULL;
  new_file_msg = NULL;

  fclose(new_fp);
  return 0;
}



单步调试的时候出现段错误。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 446
活跃值: (186)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
2
楼主是故意的么
include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

int main(void)
{  
  char *file_name[3] = 
  {    
    "test1.c",
    "test2.c",
  };

  FILE *new_fp = NULL;
  new_fp = fopen("newfile.txt", "w+");
  if (NULL == new_fp)
  {
    printf("Crear new file error!\n");
    return -1;
  }
  
  char *file_msg = NULL;
  file_msg = (char *)malloc(40960);
  if (NULL == file_msg)
    return -1;

  char *new_file_msg = NULL;
  new_file_msg = (char *)malloc(40960);
  if (NULL == new_file_msg)
    return -1;

  char *p_src = file_msg;
  char *p_dst = new_file_msg;

  int i = 0;
  while(NULL != file_name[i])
  {
    memset(file_msg, '\0', 40960);
    memset(new_file_msg, '\0', 40960);

    FILE *fp = NULL;
    fp = fopen(file_name[i], "r");
    if (NULL == fp)
    {
      printf("Open file :%s error!\n",file_name[i]);
      return  -1;
    }

    fread(file_msg, 1, 4096, fp); 

    while(NULL != *file_msg)
    {
      if (NULL == *(file_msg + 1))
        break;

      if (('/' == *file_msg) && ('/' == *(file_msg + 1)))
      {/*本行后面全部为注释*/
        while ('\r' != *file_msg)
          file_msg++;

        file_msg += 2;
      }
      else if (('/' == *file_msg) && ('*' == *(file_msg + 1)))
      {/*注释符号开始*/
        file_msg += 2;

        while (strncmp(file_msg, "*/", 2))
          file_msg++;

        file_msg += 2;
      }
      else if (('\r' == *file_msg) && ('\n' == *(file_msg + 1)))
      {/*到达行尾*/
        file_msg += 2;  
      }
      else
      {//真实有效数据
        *new_file_msg = *file_msg;
        new_file_msg++;
        file_msg++;
      }
    }

    file_msg = p_src;
    new_file_msg = p_dst;
    fwrite(new_file_msg, strlen(new_file_msg), 1, new_fp);

    fclose(fp);
    i++;
  }

  free(new_file_msg);
  free(file_msg);
  file_msg = NULL;
  new_file_msg = NULL;

  fclose(new_fp);
  return 0;
}



这是你的
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

int main(void)
{  
  char *file_name[] = 
  {    
    "test1.c",
    "test2.c",
  };

  FILE *new_fp = NULL;
  new_fp = fopen("newfile.txt", "w+");
  if (NULL == new_fp)
  {
    printf("Crear new file error!\n");
    return -1;
  }
  
  char *file_msg = NULL;
  file_msg = (char *)malloc(40960);
  if (NULL == file_msg)
    return -1;

  char *new_file_msg = NULL;
  new_file_msg = (char *)malloc(40960);
  if (NULL == new_file_msg)
    return -1;

  char *p_src = file_msg;
  char *p_dst = new_file_msg;

  int i = 0;
  while(NULL != file_name[i])//数组越界,i到了2就越界了
  {
    memset(file_msg, '\0', 40960);
    memset(new_file_msg, '\0', 40960);

    FILE *fp = NULL;
    fp = fopen(file_name[i], "r");
    if (NULL == fp)
    {
      printf("Open file :%s error!\n",file_name[i]);
      return  -1;
    }

    fread(file_msg, 1, 4096, fp); 

    while(NULL != file_msg)// file_msg似乎永远不可能等于NULL,应该是*file_msg吧
    {
      if (NULL == (file_msg + 1))//这儿也是* (file_msg + 1)
        break;

      if (('/' == *file_msg) && ('/' == *(file_msg + 1)))
      {/*本行后面全部为注释*/
        while ('\r' != *file_msg)
          file_msg++;

        file_msg += 2;
      }
      else if (('/' == *file_msg) && ('*' == *(file_msg + 1)))
      {/*注释符号开始*/
        file_msg += 2;

        while (!strncmp(file_msg, "*/", 2))//楼主要除掉//,应该不用加'!'吧
          file_msg++;

        file_msg += 2;
      }
      else if (('\r' == *file_msg) && ('\n' == *(file_msg + 1)))//不知道楼主是想除掉换行符吗?如果除掉换行符应该是前面是'\n',后面是'\r'吧
      {/*到达行尾*/
        file_msg += 2;  
      }
      else
      {//真实有效数据
        *new_file_msg = *file_msg;
        new_file_msg++;
        file_msg++;
      }
    }

    file_msg = p_src;
    new_file_msg = p_dst;
    fwrite(new_file_msg, strlen(new_file_msg), 1, new_fp);

    fclose(fp);
    i++;
  }

  free(new_file_msg);
  free(file_msg);
  file_msg = NULL;
  new_file_msg = NULL;

  fclose(new_fp);
  return 0;
}

2012-6-20 21:39
0
雪    币: 446
活跃值: (186)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
3
呃,没看到你后面还有个逗号,偶是用C++写的没有发现错误,不知道C是不是和C++有点不同
char *file_name[] = 
  {    
    "test1.c",
    "test2.c",
  };
2012-6-20 22:02
0
雪    币: 31
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢你的关注。

但是以下代码是没有错误的:

“  while(NULL != file_name[i])//数组越界,i到了2就越界了” 我的file_name使用的是数组指针,所以file_name[i] 取的是文件名字符串的地址,不等于NULL表示的是找到二维数组的最后一个元素。

“while(NULL != file_msg)// file_msg似乎永远不可能等于NULL,应该是*file_msg吧”
file_msg 是指针, NULL != file_msg表示的是到达最后一个字符。 若是用*file_msg 的话
应该是   '\0' != *file_msg

"if (NULL == (file_msg + 1))//这儿也是* (file_msg + 1)
        break;  “和上面一样。

” while (!strncmp(file_msg, "*/", 2))//楼主要除掉//,应该不用加'!'吧“  这一句 strncmp的返回值为0的时候是找到相同的字符串。

换行符我记得是”\r\n“  不是 "\n\r",不知道是不是我记错了。

我的代码出错处在  
        *new_file_msg = *file_msg;
        new_file_msg++;
        file_msg++;  这个部分。
当循环到0xc000次数的时候就溢出了,具体原因不明吧。
2012-6-21 09:00
0
雪    币: 446
活跃值: (186)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=smartdog;1081639]谢谢你的关注。

但是以下代码是没有错误的:

“  while(NULL != file_name[i])//数组越界,i到了2就越界了” 我的file_name使用的是数组指针,所以file_name[i] 取的是文件名字符串的地址,不等于NULL表示的是找到二维数组的最后一个元素。
...[/QUOTE]

呃,或许是我不理解你要做什么吧。你运行我给的代码了,我的报错了吗?另外我想说的是  NULL != *file_msg 和 '\0' != *file_msg似乎都是一样的吧,没什么区别吧?
2012-6-21 10:55
0
雪    币: 31
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
" NULL != *file_msg 和 '\0' != *file_msg似乎都是一样的吧"

不是一样的  NULL  表示的是一个空指针, 而*file_msg 表示的是 file_msg只想的第一个元素。指针可数据是不会有逻辑运算。

当 file_msg = NULL 的时候,运行 “NULL != *file_msg” 就会段错误。

你可以试试这段C++代码

        char *p = NULL;

        if (NULL != *p)
                cout << "Error!" <<  endl;

        cout << "OK !" << endl;
2012-6-21 11:10
0
雪    币: 446
活跃值: (186)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
7
你当我是没入门啊,我自学C++将近一多年了,如果连这都不知道我就去撞死了。你访问p就是空指针,你不崩溃才怪。我看你是刚入门不久的,估计连调试都不会吧,我当初也不懂调试,全凭自己一点一点尝试,在容易出错的地方多加几个输出,来定位错误的地方。我不懂 你要说什么,我想说的 NULL 和 '\0'等同,比喻你 int i=NULL; 和 int i='\0'; 最终i的值都为0,'\0'就是0的转义。我知道我表达的不清楚,也不知道你说的是不是这
2012-6-21 12:09
0
雪    币: 31
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
给你看看VC实现的NULL  

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

‘\0’ 是字符的结束标志,但是 (void *)(0) 是地址为零的内存区域。这还能是一样的吗 ?

我在吧问题描述一遍:
我的代码出错处在  
        *new_file_msg = *file_msg;
        new_file_msg++;
        file_msg++;  这个部分。
当循环到0xc000次数的时候就溢出了,具体原因不明吧。

你可以找两个文本或者代码试试就知道了。
2012-6-21 12:37
0
雪    币: 446
活跃值: (186)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
9
我受不了,你代码到底是C++还是C的,似乎C语言变量必须申明在代码前,我把你代码用C编译一堆错误。好吧,我承认我技术不行,这个问题我解决不了,你就当我没回答过吧,偶去学习了
2012-6-21 12:58
0
游客
登录 | 注册 方可回帖
返回
//