作者grantchiue (鸭子)
站内C_and_CPP
标题[问题] 阵列内中英文字串的反转(序)
时间Sun Mar 22 03:10:14 2009
不好意思,这是作业Q3Q(被揍
我研究了好几天,版上有getline、字串...等好几十种关键字的文章我都看好几遍了,
Google也估了几十种了 囧" 结果我还是写不出来OTL
我们教授要我们去把一个big-5的文字档读进程式,然後将每一行自己前後顺序反转後
逐行输出到文字档,不过文字档不是固定的,且内含中英文
我研究到後来才知道中文字串不能直接反转,所以得去判断读进去的是中文还是英数,
我主要是希望用阵列的方式去做,不是用内建的函式(有吗XD)去做反转,所以去查了
之後发现可以用判断16进位的方式去看是不是在范围内(0x80~0xfe)
我的想法是先将文字档一行一行读,先用getline读进去第一个阵列,
这边先遇到一个问题,一排句子结尾应该是 ......\n\0这样吗? 囧
所以说我用getline去读他会把\n丢掉,所以我读进去是 ......\0 这样
所以之後我使用strlen()取得的阵列内容大小是含着\0 的,
然後我用if和else if来判断他是不是中文字
我是先把第一个阵列从倒数第二个开始读,想说这样就不会读到\0 了
然後再开始倒着写入第二个阵列
假设我现在阵列一有读到内容: a b c 我 d e \0 (8个字元)
然後我开始从阵列一的倒数第二位 e开始读,然後放到阵列二的第一位,然後
阵列一的倒数第三位 d , 放到阵列二的第二位,然後
阵列一的倒数第四位 我的後面, 放到阵列二的第
四位,然後
将阵列一的倒数第五位, 我的前面放到阵列二的第三位,
以这样的方法一直读到阵列一的第一位,写完第二个阵列的第七个位元,
之後我自己将阵列二的第八位补上\0
之後再用.write()写入一整行,大小是八位元
请问这样有观念上的问题吗(一定有,因为我跑出来结果失败Q3Q)?
且这样做好像不会自己换行输出到档案,结果变成全部在同一行
=================================
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main(){
fstream Input, Output;
char info[128];
char infore1[128];
Input.open("input.txt",ios::in|ios::binary);
Output.open("output.txt",ios::out|ios::binary);
//就是用这里读进一整行
while(Input.getline(info, 128, '\n')){
for(int i=0;i<strlen(info)-1;i++){
if((unsigned char)info[strlen(info)-2-i]>=0x80 && (unsigned
char)info[strlen(info)-2-i]<=0xfe){
infore1[i+1]=info[strlen(info)-2-i];
infore1[i]=info[strlen(info)-3-i];
i++;
}
else{
infore1[i]=info[strlen(info)-2-i];
}
}
infore1[strlen(info)]='\0';
//补上\0 ,可是好像没影响
Output.write(infore1,strlen(info));
}
Input.close();
Output.close();
return 0;
}
==============================================
我是用code::block写的OTL 想请问前辈们,我哪边观念有问题(当然有 囧)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.172.248.107
1F:推 Ebergies:如果你的 "abc我de" 是对的, 测一下 "abc你de" 看看 03/22 09:17
2F:→ grantchiue:不行,我都没办法正常输出 03/22 09:43
3F:推 joefaq:swap要一个temp 03/22 11:09
4F:→ grantchiue:可是我是使用两个阵列,不是一个阵列自己交换,这样是 03/22 11:53
5F:→ grantchiue:不是就不用使用一个temp 03/22 11:53