2

我想提取 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;

注意:文件名严格采用fileXX格式,XX是 01 到 99 之间的数字

4

5 回答 5

2

你得到未定义的行为,因为你从来没有为char*你读到的分配内存:

char * fname = new char[16];  //should be enough for your filename format

或者更好

char fname[16];

另外,你有什么期望:

fname[4]%10+fname[5];

去做?神奇地连接数字?

首先,将第一个 char 转换为 an int,将其乘以10,将第二个 char 转换为 anint并添加到第一个。一个简单的谷歌搜索char to int将带你到那里。

于 2012-05-07T16:21:47.570 回答
2

您需要减去'0'以获得数字字符的十进制值:

int filenum=(fname[4]-'0')*10+(fname[5]-'0');

更好的是,您应该使用atoi

int filenum = atoi(fname+4);
于 2012-05-07T16:23:32.063 回答
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";
}
于 2012-05-07T16:33:27.417 回答
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;
}
于 2012-05-07T16:39:42.463 回答
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 (and sscanf) also throws in checking for proper input format: returns number of fields read successfully. In this case if return value is any other than 1, the input was wrong.

于 2012-05-07T16:48:25.930 回答