注册 登录
编程论坛 C++教室

帮我解决个问题

windyfzz 发布于 2010-07-25 19:12, 535 次点击
#include<iostream>   
#include<fstream>   //程序意图:
#include<stdlib.h>  //输入一行字符,把其中的字母放到磁盘文件file中。在把它从磁盘文件读入程序
using namespace std;//把其中的小写字母改为大写字母,在存入磁盘文件file2中,同时在屏幕上输出
void save_file()
{
    char str[80];
    int i;
    ofstream outfile("file1.txt");
    if(! outfile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    cin.getline(str,80);
    for(i=0;str[i]!=0;i++)
    {
        if(str[i]>=65&&str[i]<=90||str[i]>=97&&str[i]<=122)
        {
            outfile<<str[i]<<" ";
            
        }
    }
    outfile.close();
}
void from_file()
{   char str;
    ifstream infile("file1.txt");
    if(! infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    ofstream outfile("file2.txt");
    if(! outfile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }

    while(infile.get(str))
    {
      if(str>=97&&str<=122)
      {
          str-=32;
          outfile<<str<<" ";
          cout<<str<<" ";
      }
   
    }
    infile.close();
    outfile.close();
}
int main()
{
   
    save_file();
    from_file();
    system("PAUSE");
    return 0;
}

1.谁能告诉我for(i=0;str[i]!=0;i++)中为什么是str[i]!=0(这里的0是什么意思呢?)
2.为什么我把void save_file()中的改为for(i=0;str[i]!='\n';i++)屏幕显示的结果后面无缘无故的多了一些字母
呢!例如我输入 Hello, world!  正确的显示应该是 E L L O W O R L D.
但是此时却显示E L L O W O R L D P R O O O C D X.
3 回复
#2
mxs8102010-07-25 20:19
1、for(i=0;str[i]!=0;i++)中为什么是str[i]!=0(这里的0是什么意思呢?)
    应该表示的是str结束吧?
2、为什么我把void save_file()中的改为for(i=0;str[i]!='\n';i++)屏幕显示的结果后面无缘无故的多了一些字母
    设置断点,单步跟踪,看一下str中的内容就得到答案了~~

祝你好运,要找到调试程序的基本方法。
#3
JINyuanbao2010-07-25 22:25
开始是设置的是str[i]!=0其实就是str[i]!='\0' 因为nul ,0,\0 的ASCII码是相同的。意思是为空。运行到str[12]就结束了

而你后面的 str[i]!='\n' 意思是回车换行。而你在换行之前你有又用cin.getline(str,80);你给这个字符串分配了80个字符空间。所以等到你运行完一行后才会结束。而在你运行时你后面的字符未初始化所以系统随机分配。 P R O O O C D X至于这几个字符我看了一下应该是系统随机分配的。不过我测试了几组数据看起来又像有点规律。没研究出来他是怎么来的。希望哪位高手来说说具体原理吧。
#4
windyfzz2010-07-25 23:03
恩,谢了!
1