我想提取char数组的数字字符串值。实际上我想提取文件名中嵌入的数字以进行某些文件管理。例如,如果文件名为 file21 ,则我希望此文件名中的十进制数 21 。
我如何提取这些值?
我尝试了以下操作,但会产生意外值。我认为这是在进行关节运动时从char到int的隐式类型转换的结果。
char * fname;
cout<<"enter file name";
cin>>fname;
int filenum=fname[4]%10+fname[5];
cout<<"file number is"<<filenum;
注意: filenamse严格采用 fileXX 格式, XX 是01到99之间的数字
答案 0 :(得分:2)
您正在获得未定义的行为,因为您永远不会为您读入的char*
分配内存:
char * fname = new char[16]; //should be enough for your filename format
或更好
char fname[16];
另外,您的期望是什么:
fname[4]%10+fname[5];
要做什么?神奇地连接数字?
首先,将第一个字符转换为int
,将其乘以10
,将第二个字符转换为int
并添加到第一个字符。对char to int
进行简单的谷歌搜索可以帮助您。
答案 1 :(得分:2)
您需要减去'0'
以获取数字字符的十进制值:
int filenum=(fname[4]-'0')*10+(fname[5]-'0');
更好的是,您应该使用atoi
:
int filenum = atoi(fname+4);
答案 2 :(得分:1)
我如何提取这些值?
有无数种方法。一种方法是使用std::istringstream
:
#include <string>
#include <sstream>
#include <iostream>
int main () {
std::string fname;
std::cout << "Enter file name: ";
std::getline(std::cin, fname);
int filenum;
std::istringstream stream(fname.substr(4,2));
if(stream >> filenum)
std::cout << "file number is " << filenum << "\n";
else
std::cout << "Merde\n";
}
答案 3 :(得分:0)
这是最简单的代码:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
int filenum;
string fname;
cout<<"enter file name";
cin>>fname;
string str2 = fname.substr(4,2);
istringstream(str2) >> filenum;
cout<<"file number is"<<filenum;
return 0;
}
答案 4 :(得分:0)
如果您的输入定义太多,最简单的解决方案是scanf:
int main()
{
int theNumber = 0;
scanf("file%d.txt", &theNumber);
printf("your number is %d", theNumber);
}
检查它的实际效果,读取char *而不是stdio:http://codepad.org/JFqS70yI
scanf(和sscanf)也会检查输入格式是否正确:返回成功读取的字段数。在这种情况下,如果返回值不是1,则输入错误。