我有一个文本文件,如下所示:
Fulladder
3个输入
INPUT(A)
INPUT(B)
INPUT(CIN)
现在我需要知道输入的名称,这里是'A','B'和'Cin'。我可以打开文件并阅读它。但我得到了奇怪的输出。我的代码如下:
// Finding the names of inputs
if(buffer[i] == 'I' && buffer[i+1]=='N' && buffer[i+2]=='P' && buff er[i+5]=='(')
{
if( buffer[i+7]==')' ) // i.e. single digit Input name
{
char inputName[1];
inputName[0] = buffer[6];
string name(inputName);
cout<<"\n Name of inputs: "<<inputName[0]<<"\n";
}
else if( buffer[i+8]==')' ) // To check is the value of value of inputs consists of one digit or two digit
{
char inputName[2];
inputName[0] = buffer[6]; inputName[1] = buffer[7];
string name(inputName);
cout<<"\n Name of inputs: "<<inputName[0]<<inputName[1]<<"\n";
}
else if( buffer[i+9]==')' ) // i.e. three digit Input name
{
char inputName[3];
inputName[0] = buffer[6]; inputName[1] = buffer[7]; inputName[2] = buffer[8];
string name(inputName);
cout<<"\n Name of inputs: "<<inputName[0]<<inputName[1]<<inputName[2]<<"\n";
}
}
但我得到以下输出:
输入名称:a
输入名称:a
输入名称:添加
答案 0 :(得分:4)
从缓冲区复制字符时,忘记按i
进行偏移。例如:
inputName[0] = buffer[6];
应该是:
inputName[0] = buffer[i+6];
答案 1 :(得分:2)
#include <iostream>
#include <string>
using namespace std;
string getpart(string &input){
string pre("INPUT(");
string ret("");
size_t len = pre.length();
size_t pos = input.find(pre);
if(pos == 0){
pos = input.find(")", len);
ret = input.substr(len, pos - len);
}
return ret;
}
int main() {
string input, part;
for(int i=0; i<3 ; ++i){
cin >> input;
part = getpart(input);
cout << part << endl;
}
}
#include <iostream>
#include <string>
using namespace std;
string getpart(string &input, const char *pre, const char *post){
string ret("");
string::size_type pre_pos = input.find(pre), len = string(pre).length();
if(pre_pos != string::npos){
pre_pos += len;
string::size_type post_pos = input.find(post, pre_pos);
if(post_pos != string::npos)
ret = input.substr(pre_pos, post_pos - pre_pos);
}
return ret;
}
int main() {
string input, part;
getline(cin, input);
part = getpart(input, "INPUT(", ")");
cout << part << endl;
}
答案 2 :(得分:1)
看起来你有一个计数器“i”,它可能代表当前行的开头,但是当你实际将字符拉出数组时,你正在读取固定索引。
例如,对于单字符的情况,您应该从“buffer [i + 6]”而不是“buffer [6]”中读取。
话虽如此,我强烈建议您编写一些函数来弄清楚如何解析这些行,这样就不必为每个可能的值长度编写代码。
答案 3 :(得分:1)
@ user2440724 - 关于您对我的评论的问题:查看(运行)这个使用strtok()
的小例子。在您单步执行时,设置一个断点并查看buf的值:
#include <ansi_c.h>
int main(void)
{
char buffer[]="INPUT(A)"; //simulated line buffer
char *buf;
buf = strtok(buffer, "(");//strip away INPUT and (
buf = strtok(NULL, ")");//Capture contents of ( )
//do something with "A", read next line buffer
return 0;
}