问题,为什么C里能用,C++用不了。

bear3312 2000-08-14 05:16:00
#include <fstream.h>
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include <dir.h>
#include <stdlib.h>



void main(int argc, char *argv[])
{
char str[256],bm[4],*ml,*kb,wjm[256],de[256];
int i,z,js,js1,js2,js3,js4;
js3=0;
*kb = 0x00;//用指针时必须先指定起始地址,
*ml = 0x00;//否则会出错。
//*wjm = 0x00;
de[0]='d';
de[1]='e';
de[2]='l';
de[3]=' ';
js4=4;
while(argv[1][js3])
{ wjm[js3]=argv[1][js3];
de[js4]=argv[1][js3];
js3+=1;
js4+=1;
}
de[js4]='\0';
// cout<<de;
wjm[js3]='.';
wjm[js3+1]='t';
wjm[js3+2]='x';
wjm[js3+3]='t';
wjm[js3+4]='\0';
kb[0]='c';
kb[1]='o';
kb[2]='p';
kb[3]='y';
kb[4]=' ';
ml[0]='d';
ml[1]='i';
ml[2]='r';
ml[3]=' ';
if ( argc==1)
{
cout<<"error";
//return;
exit(0);
}
FILE *fl, *ft;
int ch;
fl = fopen(argv[1] , "rb" );
ft = fopen( "temp", "wb" );
while (!feof(fl) ) {
ch = getc( fl );
// if ( feof( fl ) ) break;
if ( ch==0x8d ) {
ch = 0x0d; }
fputc( ch, ft );
}
fclose(fl);
fclose(ft);











// char ch[256],str[256],bm[4];
// int i,z;
// if (argc>1 && argc==0)
// cout<<"error";





ifstream wj;
wj.open("temp");
ofstream temp;
// temp.open(argv[1]);
temp.open(wjm);

// cout<<"请输入二位编码";
// cin>>bm;
//temp.open("temp.txt");
wj.getline(str,256);
// cout<<str;
while (wj)
{
if ((str[0]>'A' && str[0]<'Z') && strlen(str)<11)//&&(str[9]='' and and str[9]=\0)
{
temp<<"{cl}"<<str<<endl;
wj.getline(str,256);
}

// wj.getline(str,256);
if(str[0]=='[' && str[1]=='Z' && str[4]==']')
{

temp<<str<<endl;
// temp<<bm<<endl;
temp<<'['<<argv[1][4]<<argv[1][5]<<']'<<endl;
wj.getline(str,256);
temp<<"{so}"<<str<<endl;
wj.getline(str,256);
temp<<"{au}"<<str<<endl;
wj.getline(str,256);
}
else
{
temp<<str<<endl;
wj.getline(str,256);
}
}
wj.close();
temp.close();
system("del temp");

js=0;
js1=5;
js2=4;
while(wjm[js])
{ kb[js1]=wjm[js];
ml[js2]=wjm[js];
// de[js2]=wjm[js];
js2++;
js1++;
js++;
}
kb[js1]=' ';
kb[js1+1]='h';
kb[js1+2]=':';
kb[js1+3]='\0';
ml[js2]='\0';

// cout<<ml;
system(ml);
cout<<kb;
system(kb);
cout<<de;
system(de);
}


上面有一段把软回车,变成硬回车, 可是在C++里软回车的值不认, 可是C就认,这是为什么呀。

还有我想用指针实现动态数组,是必须先把指针给个值吗?(开始没给值,死机)

我想实现DOS里的命令, 可是SYSTEM只能放字符串,有没有其它的办法。

...全文
239 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
元明 2000-08-17
  • 打赏
  • 举报
回复
感兴趣
  • 打赏
  • 举报
回复
//举个分配内存的例子,因为很少使用,可能有不完善的地方,还请大家一起研究
//farrealloc 函数可以扩大、缩小由 farmalloc 分配的内存空间

#include <iostream.h>
#include <alloc.h>

int main(void)
{
//在IDE环境运行可能看到剩余内存非常小, 但是在DOS下直接运行.EXE文件就正常了
//如果看到程序结束的剩余内存和程序开始的剩余内存不同, 说明内存分配有问题,
//如果程序循环执行这段代码就会占满所有内存, 无法继续运行, 甚至导致死机.

cout<<"程序开始剩余内存: "<<farcoreleft()<<" 字节\n";
//farcoreleft 函数仅限于在 DOS 版本的 Turbo/Borland C/C++ 返回剩余内存大小
//并且 farcoreleft 不能在 tiny 模式下运行, tiny 模式用 coreleft 函数代替

char far *Buffer1;
unsigned int far *IntBuf2;
unsigned int i;

//给 Buffer1 分配一个空间: char[10]
Buffer1 = (char far *)farmalloc(sizeof(char)*10);
cout<<"剩余内存(A): "<<farcoreleft()<<" 字节\n";
//给 IntBuf2 分配空间: unsigned int[100]
IntBuf2 = (unsigned int far *)farmalloc(sizeof(unsigned int)*10);
cout<<"剩余内存(B): "<<farcoreleft()<<" 字节\n";

for(i=0; i<10; i++)
{
Buffer1[i] = 'A'+i;
IntBuf2[i] = i*i;
}

//扩大指针分配的空间到50个元素 char[50]
char far *NewPtr1 = (char far *)farrealloc(Buffer1, sizeof(char)*50);
if(NewPtr1)
{
Buffer1 = NewPtr1; //必须重新赋值, 因为新地址与原地址有可能不同
cout<<"剩余内存(C): "<<farcoreleft()<<" 字节\n";

//扩大指针分配的空间到50个元素 unsigned int[50]
unsigned int far *NewPtr2 = (unsigned int far *)farrealloc(IntBuf2, sizeof(unsigned int)*50);
if(NewPtr2)
{
IntBuf2 = NewPtr2; //必须重新赋值, 因为新地址与原地址有可能不同
cout<<"剩余内存(D): "<<farcoreleft()<<" 字节\n";
for(i=10; i<50; i++) //给多出来的40个元素赋值, 保留原来的值
{
Buffer1[i] = 'A'+i;
IntBuf2[i] = i*i;
}
for(i=0; i<50; i++) //输出所有50个元素的值
cout<<i<<":{'"<<Buffer1[i]<<"',"<<IntBuf2[i]<<"}\t";
cout<<"\n";
}
else
{
cout<<"扩大 IntBuf2 分配空间失败\n";
}
}
else
{
cout<<"扩大 Buffer1 分配空间失败\n";
}

//扩大一大块内存到60000个元素: char[60000u]
NewPtr1 = (char far *)farrealloc(Buffer1, sizeof(char)*60000u);
if(NewPtr1)
{
Buffer1 = NewPtr1; //扩大成功, 必须重新赋值, 因为新地址与原地址有可能不同
cout<<"剩余内存(E): "<<farcoreleft()<<" 字节\n";
//现在可以使用大的 Buffer1 了
}
else
{
cout<<"扩大 Buffer1 到 char[60000] 失败\n";
}

if(IntBuf2)farfree(IntBuf2); //如果分配内存成功, 必须
cout<<"剩余内存(F): "<<farcoreleft()<<" 字节\n";
if(Buffer1)farfree(Buffer1); //释放指针分配的内存空间
cout<<"程序结束剩余内存: "<<farcoreleft()<<" 字节\n";

return 0;
}
  • 打赏
  • 举报
回复
由于CSDN改版,我几乎无法访问专家门诊,但改版以前专家门诊的速度非常快。
昨天按了一晚上鼠标没进去专家门诊 :-(
----------------------------------------------------------------------
指针不分配内存, 并且不给地址赋值, 这个指针的地址是随机数:
(1) 如果这个地址(随机数)指向未用内存, 在DOS下不会有任何麻烦, 反正谁也不用,
但是在保护模式下的操作系统, 例如 Windows 就会产生非法操作, 因为在 Windows
下不允许访问未经操作系统分配的内存
(2) 如果这个地址指向别的程序的数据段, 你将会修改那个程序的数据, 如果你修改
的数据是 DOS 或 BIOS 的数据 ......
(3) 这还不算, 如果你的指针指向你自己或者别的程序的代码, 并且你修改了指针的
数据, 就相当于修改了那个程序的代码, 而把你的数据当作代码来运行, 嘿嘿, 不说
你也知道会出现什么结果

地址是随机数,按照你的 *kb=0 是给随机的地址赋值,但是 C 的编译器并不是产生
一个随机数赋值给 kb 的地址,程序运行时 kb 变量在程序装载到内存以前是什么就
还保留什么值,或者在编译时内存这个变量是什么就保留什么,又可能碰巧编译哪个
*kb=0 时 kb 的值赶上一个不重要的,或者没有用的内存,还是有出错的可能的。

我认为一般有以下几种情况用指针:
(1) 临时用一段内存, 使用后释放掉
(2) 想用内存某个地址, 或者程序的某个地址的数据
(3) 想运行内存某个地址, 或者程序的某个地址的程序代码
(4) 不知道要多大内存, 在程序运行中确定大小
(5) 传递参数
(6) 建立复杂数据结构
(7) 也许还有常见的,一时想不起来,不过一定还有其他用途

一般动态分配内存大小要用链表, 或者树, 图等数据结构, 很少修改单个指针占用内存
的大小, 修改一般也只能往小了改

比如用 farrealloc 函数修改以前用 farmalloc 分配的内存, 如果把分配的内存改小,
不用说了, 如果把分配的内存改大, 一般会出现这样的结果: 重新分配一块内存空间,
大小和新给的相同, 再把以前用 farmalloc 分配的内存内容复制到新分配的大块内存,
再把以前用 farmalloc 分配的内存释放掉, 把指针的地址修改为指向新分配的大块内
存的地址, 才算结束 farrealloc 函数的任务. 如果内存剩余的空间小于新分配内存
的空间, 即使从容量上看可以, 由于以上步骤的出现, 不可能成功,看看例子:

修改前: | 指针1占内存10k | 指针2占内存5k | 剩余空间 ...
修改后: | 剩余空间10k | 指针2占内存5k | 指针1占内存18k | 剩余空间 ...
再次改: | 指针2占8k | 剩余空间7k | 指针1占内存18k | 剩余空间 ...

在 DOS 下分配内存, 分配的每块内存不得大于 64k, 因为 DOS 管理内存是以段地址:
偏移量的方式, 两个16位寄存器合成一个20位的地址, 每段的地址范围是16位的, 即
64k. 而整个 DOS 只能访问 20 位地址, 即 1M 的内存, 而操作系统把 640k 以下的
内存作为软件使用, 而在 640k 以外的内存用做硬件, 比如 BIOS, 显卡等

小于64k的内存也需要注意:
一般 C 语言程序的代码占用一个段, 如果已经有其他数据了, 就不能分配 64k 的
near 内存了, 只能分配 far 的内存, 给 far 指针分配 far 内存, 分配的内存占用
在 C 语言数据段之外的, 另分配一个新段的内存, 而分配内存要用 farmalloc 函数,
据说这个函数可以分配大于 64k 的内存给 huge 型的指针, 我好象没试成功, 并且
这样的 huge 型指针访问也不如 far 指针方便, 因为 far 指针和普通的 near 指针
没有太大区别, huge 指针与操作系统的内存分配不一样, 速度也很慢, 由 C 语言
内部处理内存地址变换. 如果 huge 指针分配的容量小于 64k, 表面上看和 far 指针
没有区别, 实际上内部处理和 far 还是有区别的

大于64k的内存
(1) 需要分配多块内存, 或者采用链表等结构, 可以超过 64k, 但是不可能达到 640k
(2) 采用磁盘文件, 或者数据库, 仅受磁盘空间限制
(3) 分配扩展内存, 比如访问 HIMEM.SYS, 可以访问超过 1M 的数据,
由于某些版本的 HIMEM.SYS 的限制, 一般不能超过 64M
(4) 采用32位地址的程序, 比如改用 Watcom C/C++ (大多数DOS版游戏), 可以访问所
有内存, 并且支持虚拟内存, 但是32位保护模式程序的编写与16位程序有区别,
有可能需要修改一些代码才能正常运行
(5) 改换操作系统, 比如 Windows 98, 操作系统变了, 程序格式完全不一样了, 必须
重编

[注]
(1) 所说的32位还是16位程序指的是访问的地址, 而不是数据
(2) 32 位程序的寄存器和 16 位的不同, 是32位的了, 比如 EAX, EBX, ECX, EDX
ESP, EBP, 但段选择器还是 16 位的, 比如 CS, DS, ES, FS, GS, SS
(3) 最重要的,也是最复杂的,就是操作系统管理硬件和内存的方式不同,最明显的就是
应用程序不能直接访问硬件,必须通过编硬件驱动程序等其他手段,操作系统把
访问硬件权限分4个特权级,ring0 - ring4,其中 ring0 为 操作系统核心
(OS kernel),ring4 为 应用软件(Applications)

暂时就想起这么多,如果有问题再一起研究
bear3312 2000-08-15
  • 打赏
  • 举报
回复
ybchen谢谢你的指点,我是受益非浅
不过,有一点不明,就是我想实现动态数组。我想的办法是用指针,可是要把指针分配内存,如果碰上一个非常大的,是不是就不能用了。而且把指针指向数组,数组已经有了一个空间怎样才能实现动态数组呢。编这个程序时我开始时设了一个指针(没有分配空间,也没指向数组,也没给值)没有错误,可是用两个指针(没有分配空间,也没指向数组,也没给值)就有错误,死机,我开始也是想是因为没有给指针分配内存,可是我把它们给了0X00的值就给以用了,这是为什么呀。谢谢各位能帮助我。
  • 打赏
  • 举报
回复
//看程序!!! 我简单看了一下,有问题再问。

#include <fstream.h>
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include <dir.h>
#include <stdlib.h>

void main(int argc, char *argv[])
{
char str[256], bm[4], *ml, *kb, wjm[256], de[256];
int i,z,js,js1,js2,js3,js4;

if(argc==1) //此段程序放到前面, 否则 argv[1] 无意义
{
cout<<"error";
//return;
exit(0);
}

//*kb = 0x00;//用指针时必须先指定起始地址,
//*ml = 0x00;//否则会出错。
//在内存分配一段未用区域, 地址赋值给 kb 和 ml
//因为指针只是一个地址变量, 如果运行了
//*kb = 0x00 而地址没赋值, 这个 0x00 不知道装到哪个地址了, 给地址赋值必须
//用不带 * 的, 而且地址必须赋值为允许程序使用的区域, 或者在内存分配一个
//空闲区域, 把这个空闲区域的地址赋值给指针, 例如:

kb = new char [MAXPATH+8]; //MAXPATH = 操作系统支持的路径+文件名的最大长度
ml = new char [MAXPATH+8]; //另外8个字符为前面命令(copy, del)的最大长度

//以上两句在内存分配大小为 MAXPATH+8 个 char 的区域,
//并且把地址赋值给指针 kb 和 ml
//在程序里分配的内存在不使用时必须删除, 否则内存里是个垃圾, 即分配的
//内存在别处无法使用, 无法访问, 也不能删除, 因为不知道地址, 这个地址
//是保存在你的指针里的, 而你的指针找不到了

//地址赋值为已知的可以使用的地址也可以, 比如:
// kb = wjm 表示指针 kb 的地址 等于 数组 wjm 的地址
// 对 kb 的访问 就是对 wjm 的访问

//另一个例子:
// kb = (char far *)0xb8000000l; //这是显卡彩色文本的显存地址
// *(kb+(10*80+5)*2)='#'; //给内容赋值: 屏幕的 第10行 第5个 字母显示 '#'
// kb[(10*80+5)*2+1]=10; //赋值的另一种写法: 屏幕的 第10行 第5个 字母颜色 绿色

de[0]='d';
de[1]='e';
de[2]='l';
de[3]=' ';

js3=0; //wjm = argv[1] + ".TXT"
js4=4; //de = "DEL " + argv[1]
while(argv[1][js3])
{
wjm[js3]=argv[1][js3];
de[js4]=argv[1][js3];
js3+=1;
js4+=1;
}
de[js4]='\0';
// cout<<de;
wjm[js3]='.';
wjm[js3+1]='t';
wjm[js3+2]='x';
wjm[js3+3]='t';
wjm[js3+4]='\0';

kb[0]='c';
kb[1]='o';
kb[2]='p';
kb[3]='y';
kb[4]=' ';

ml[0]='d';
ml[1]='i';
ml[2]='r';
ml[3]=' ';

FILE *fl, *ft;
int ch;
if(( fl = fopen(argv[1] , "rb" )) != NULL)
{
if(( ft = fopen( "temp", "wb" )) != NULL)
{
while (!feof(fl) )
{
ch = getc( fl );
// if ( feof( fl ) ) break;
if(ch == 0x8d) //我的 Borland C++ 3.1 判断没有问题, 如果有问题也是变量类型
ch = 0x0d; //的问题, 可以试一下 if((unsigned char)ch==(unsigned char)0x8d)
fputc( ch, ft );
}
fclose(fl);
}
else
{
cout<<"Cannot create file: temp\r\n";
}
fclose(ft);
}
else
{
cout<<"Cannot open file: "<<argv[1]<<"\r\n";
}

// char ch[256],str[256],bm[4];
// int i,z;
// if (argc>1 && argc==0)
// cout<<"error";

ifstream wj;
wj.open("temp");
ofstream temp;
// temp.open(argv[1]);
temp.open(wjm); //argv[1] + ".TXT"

// cout<<"请输入二位编码";
// cin>>bm;
//temp.open("temp.txt");
wj.getline(str,256);
// cout<<str;
while (wj)
{
if ((str[0]>'A' && str[0]<'Z') && strlen(str)<11)//&&(str[9]='' and and str[9]=\0)
{
temp<<"{cl}"<<str<<endl;
wj.getline(str,256);
}

// wj.getline(str,256);
if(str[0]=='[' && str[1]=='Z' && str[4]==']')
{
temp<<str<<endl;
// temp<<bm<<endl;
temp<<'['<<argv[1][4]<<argv[1][5]<<']'<<endl;
wj.getline(str,256);
temp<<"{so}"<<str<<endl;
wj.getline(str,256);
temp<<"{au}"<<str<<endl;
wj.getline(str,256);
}
else
{
temp<<str<<endl;
wj.getline(str,256);
}
}
wj.close();
temp.close();
system("del temp");

js=0;
js1=5;
js2=4;
while(wjm[js])
{
kb[js1]=wjm[js];
ml[js2]=wjm[js];
// de[js2]=wjm[js];
js2++;
js1++;
js++;
}
kb[js1]=' ';
kb[js1+1]='h';
kb[js1+2]=':';
kb[js1+3]='\0';
ml[js2]='\0';

// cout<<ml;
system(ml);
cout<<kb;
system(kb);
cout<<de;
system(de);

delete [] kb; //以后不需要访问了, 必须删除, 释放已分配的内存资源
delete [] ml; //否则在内存里扔 "垃圾"
}
bear3312 2000-08-14
  • 打赏
  • 举报
回复
我已经给了0X00,可是怎么才能知道内存地址是给以用的。
Wingsun 2000-08-14
  • 打赏
  • 举报
回复
你的程序有问题嘛,指针没有分配空间,使用起来问题肯定一大堆。kb和ml都要分配空间。动态数组就动态分配。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧