能力值:
( 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;
}
|
能力值:
( LV12,RANK:230 )
|
-
-
3 楼
呃,没看到你后面还有个逗号,偶是用C++写的没有发现错误,不知道C是不是和C++有点不同
char *file_name[] =
{
"test1.c",
"test2.c",
};
|
能力值:
( 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次数的时候就溢出了,具体原因不明吧。
|
能力值:
( 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似乎都是一样的吧,没什么区别吧?
|
能力值:
( 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;
|
能力值:
( LV12,RANK:230 )
|
-
-
7 楼
你当我是没入门啊,我自学C++将近一多年了,如果连这都不知道我就去撞死了。你访问p就是空指针,你不崩溃才怪。我看你是刚入门不久的,估计连调试都不会吧,我当初也不懂调试,全凭自己一点一点尝试,在容易出错的地方多加几个输出,来定位错误的地方。我不懂 你要说什么,我想说的 NULL 和 '\0'等同,比喻你 int i=NULL; 和 int i='\0'; 最终i的值都为0,'\0'就是0的转义。我知道我表达的不清楚,也不知道你说的是不是这
|
能力值:
( 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次数的时候就溢出了,具体原因不明吧。
你可以找两个文本或者代码试试就知道了。
|
能力值:
( LV12,RANK:230 )
|
-
-
9 楼
我受不了,你代码到底是C++还是C的,似乎C语言变量必须申明在代码前,我把你代码用C编译一堆错误。好吧,我承认我技术不行,这个问题我解决不了,你就当我没回答过吧,偶去学习了
|
|
|