很多时候,我们醉心于算法实现,研究高深的理论,却忽略了最基本的问题。这两天师兄开始华为机试,题目基本都涉及数据和文件操作,这方面自己一点儿都不熟,解决问题每次都是查,这次干脆总结下。
1 类型转换(算数类型的强制类型转换,参考C++ PRIMER 2.1.2节)
char * --> std::string
由于string支持char初始化,因此事情很好办
char chs[5] = {'1','2','3','4','5'}; std::string str(chs);
std::string --> char *
这个转换很多地方提到c_str()或者是data()函数,实际上这2个函数只能转换为const char*
std::string str("54321"); char *chs = str.c_str(); //error: invalid conversion from ‘const char*’ to ‘char*’ char *chs2 = str.data(); //error: invalid conversion from ‘const char*’ to ‘char*’
实际上,这时候较好的办法是直接在单字符层面上操作
std::string str("54321"); char chs[100] = ""; int i = 0; for(char ch : str) { chs[i] = ch; i++; }
char * --> int
知道了上面两个转换后,算数类型的操作我们都在char* 层面进行
char cnum[2] = {'2','5'}; int num = atoi(cnum);
int --> char *
在csdn论坛,提到itoa的比较多,实际上,标准库里面是只有atoi,没有itoa的(比如我的Ubuntu g++就不支持)
机智的办法是sprintf
char cnum[2]; sprintf(cnum, "%d", 52);
2 文件读取数组
简单,粗暴,直接上例子。
文件格式:第一行,数据个数N,其他行,数据:
11 1 1 2 2 2 3 3 4 5 6 11
代码:
#include <iostream> #define NUM_LENGTH 5 void ReadInts(std::ifstream &in, int N, int *nums); int main() { std::ifstream in1("1.txt"); if (in1) { char cnum[NUM_LENGTH]; in1.getline(cnum, NUM_LENGTH); int N1 = atoi(cnum); int *nums = new int[N1]; ReadInts(in1, N1, nums); int i = 0; for(; i < N1; i++) { std::cout << nums[i] << " "; } std::cout << std::endl; delete nums; } } void ReadInts(std::ifstream &in, int N, int *nums) { char cnum[NUM_LENGTH]; int i; for (i = 0; i < N; i++) { in.getline(cnum, NUM_LENGTH, ' '); nums[i] = atoi(cnum); } }