很多时候,我们醉心于算法实现,研究高深的理论,却忽略了最基本的问题。这两天师兄开始华为机试,题目基本都涉及数据和文件操作,这方面自己一点儿都不熟,解决问题每次都是查,这次干脆总结下。
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);
}
}