较大的字符数组读写问题
我想写一个小程序可以将A文件中所有AT字母互换, CG字母互换, 然后逆序输出到B文件中. 以下是我写的代码:
#include <stdio.h>
#include <malloc.h>
void main()
{
char ch,temp;
FILE *fp1, *fp2;
long n=0,i=0;
fp1=fopen( "A.txt ", "r ");
fp2=fopen( "B.txt ", "w ");
while(fgetc(fp1)!=EOF) //统计A文件中字符数
{n++;}
char *str=(char *)malloc(n*sizeof(ch)); //给str分配足够的内存空间
str= " ";
rewind(fp1);
while((ch=fgetc(fp1))!=EOF) //进行AT,CG互换
{if(ch== 'A ') str[i]= 'T ';
if(ch== 'T ') str[i]= 'A ';
if(ch== 'C ') str[i]= 'G ';
if(ch== 'G ') str[i]= 'C ';
i++;
}
str[i]= '\0 ';
for(i=n-1;i> =0;i--) 将str逆序写入B文件中
{fputc(str[i],fp2);
}
free(str);
fclose(fp1);
fclose(fp2);
}
代码在turbo C++ 3.0中编译通过, 但是执行后, B文件中出现乱码. 想不明白是哪里的问题. 请高手指教.
[解决办法]
单双引号的问题吧
字符是单引号。
[解决办法]
能编译过?
[解决办法]
1。
str=""; //这里把指针指向了一个字符串常量,指针再不指向申请的动态内存,有大问题……如果是想清零,用memset
2。
//只在str中保存了几个要转换的数据,其他都没有保存下来
while((ch=fgetc(fp1))!=EOF) //进行AT,CG互换
{if(ch== "A ") str[i]= "T ";
if(ch== "T ") str[i]= "A ";
if(ch== "C ") str[i]= "G ";
if(ch== "G ") str[i]= "C ";
i++;
}
[解决办法]
char *str=(char *)malloc(n*sizeof(ch)); //给str分配足够的内存空间
str="";
...........................
free(str);
这样写,程序没崩溃是你幸运.str又被你指向了一个字符串常量了,free字符串常量是会报内存溢出的错误的.
-------------------------
[解决办法]
- C/C++ code
#include <stdio.h> #include <malloc.h> #include <string.h>void main() { char ch,temp; FILE *fp1,*fp2; long n=0,i=0; fp1 = fopen("C:\\Documents and Settings\\Rui.2B9F317BD5854FF\\桌面\\example\\A.txt","r"); fp2 = fopen("C:\\Documents and Settings\\Rui.2B9F317BD5854FF\\桌面\\example\\B.txt","w"); if(!fp1 || !fp2) { return; } while(fgetc(fp1) != EOF) //统计A文件中字符数 { n++; } char *str=(char *)malloc((n * sizeof(ch)) + 1); //给str分配足够的内存空间 strcpy(str,""); rewind(fp1); while((ch = fgetc(fp1)) != EOF) //进行AT,CG互换 { str[i] = ch; if(ch == 'A') str[i] = 'T'; if(ch == 'T') str[i] = 'A'; if(ch == 'C') str[i] = 'G'; if(ch == 'G') str[i] = 'C'; i++; } str[i]= '\0'; for(i = n - 1;i != -1;i--) //将str逆序写入B文件中 { fputc(str[i],fp2); } free(str); fclose(fp1); fclose(fp2); }
[解决办法]
楼上都回答了,我就来蹭点分吧
[解决办法]
8楼做得不错。
[解决办法]
这么多分啊
来蹭点儿分……
[解决办法]
8楼不错~~~