如何从char数组中提取数字字符串成员

时间:2012-05-07 16:19:51

标签: c++ arrays casting

我想提取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之间的数字

5 个答案:

答案 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,则输入错误。