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

字符串逆向输出问题

feng1008wd 发布于 2013-10-24 20:13, 2776 次点击
如题  例如输入字符串“what a nice day” 则输出“day nice a what” 字符串多行从文件读取 但我输出的却是“day nice a hat” 调试发现第一个字符‘w’未赋值进数组   应该是read(char s[N][M],int* i)中while(in.get()!=EOF)那句先把第一个字符‘w’get了   然后再调用getline()就没有了第一个字符   可怎么解决这个问题呢?
程序代码:
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;
const int N=10;
const int M=100;
void reversestring(char* s){
    int len=0;
        while(s[len]!='\0'){
            len++;
    }
    int k=len;
    for(int i=len;i>=0;i--){
        if(s[i]==' '){
            for(int j=i+1;j<=k;j++){
                cout<<s[j];
            }
            cout<<" ";
            k=i;
        }
        if(i==0){
            for(int j=0;j<k;j++){
                cout<<s[j];
            }
        }
    }
}
void read(char s[N][M],int* i){
    ifstream in("string.txt");
    if (!in)
    {
        cerr<<"error:can not open file:input.txt"<<endl;
        return ;
    }
    *i=0;

    while(in.get()!=EOF){
        in.getline(s[*i],M);
        (*i)++;
    }
//    for(int j=0;(s[*i][j]=in.get())!=EOF;j++){
//        if(s[*i][j]=='\n'){
//            (*i)++;
//            j=0;
////            cout<<endl;
//        }
////        else{
//////            cout<<s[*i][j];
////        }
//    }
}

int main(){

    char s[N][M];
    int num=0;
    read(s,&num);
    for(int i=0;i<num;i++){
        reversestring(s[i]);
        cout<<endl;
    }

    system("pause");
    return 0;
}
4 回复
#2
rjsp2013-10-25 12:42
很多东西没交代清楚,比如 a    b c 是输出成 c b a 还是 c b    a,抑或是输入保证不出现两个空格?

因此,写个demo给你参考一下吧
程序代码:
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>
using namespace std;

int main()
{
    string line;
    getline( cin, line );

    istringstream is(line);
    vector<string> words = vector<string>( istream_iterator<string>(is), istream_iterator<string>() );
    for( vector<string>::const_reverse_iterator itor=words.rbegin(); itor!=words.rend()-1; ++itor )
        cout << *itor << " ";
    cout << words.front() << endl;

    return 0;
}

#3
feng1008wd2013-10-25 13:27
回复 2楼 rjsp
我如果要从文件读取多行呢 不确定多少行  那最开始总要有个xxx.get()!=EOF 吧  但这样再去调用XXX.getline() 好像这一行的第一个字符就获取不到了   我调试程序就是发现这个问题的
#4
rjsp2013-10-25 14:27
开始总要有个xxx.get()!=EOF
----- 我跟你说,你这种用法是错误的,EOF这个状态是读过但无数据可读,也就是说即使 非EOF,也不表示文件还有数据可读

程序代码:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>
using namespace std;

int main()
{
    ifstream in("string.txt");
    for( string line; getline(in,line); )
    {
        istringstream is(line);
        vector<string> words = vector<string>( istream_iterator<string>(is), istream_iterator<string>() );
        if( words.empty() ) // 防止文件中有空行
        {
            cout << '\n';
            continue;
        }

        for( vector<string>::const_reverse_iterator itor=words.rbegin(); itor!=words.rend()-1; ++itor )
            cout << *itor << " ";
        cout << words.front() << '\n';
    }
    cout << flush;

    return 0;
}

#5
feng1008wd2013-10-25 15:13
回复 4楼 rjsp
受教了
1