我文件的第一行必须是我读入firstline [2]的两位数字。我使用sscanf从该缓冲区读取数据并将其存储到一个int中,以表示文件中的行数(不包括第一行)。如果有第三个字符,我必须退出并输入错误代码。
我尝试引入新的char缓冲区thirdchar [1]并将其与新行(10或'\ n')进行比较。如果thirdchar不等于换行符,则应以错误代码退出。稍后在我的程序中,我使用sscanf读取第一行并将该数字存储到一个称为numberoflines的int中。当我引入thirdchar时,它会将numberoflines的额外两个零附加到firstline的末尾。
//If the first line was "20"
int numberoflines;
char firstline[2];
file.get(firstline[0]);//should be '2'
file.get(firstline[1]);//should be '0'
char thridchar[1];
file.get(thirdchar[0]);//should be '\n'
if (thirdchar !=10){exit();}//10 is the value gdb spits out to represent '\n'
sscanf(firstline, "%d", &numberoflines);//numberoflines should be 20
我调试了这个,并且firstline和thirdchar是期望的值,但是numberoflines变成了2000!我已经删除了与thirdchar有关的代码,它可以正常工作,但不满足要求它是2位数字的要求。我是否误解了sscanf的功能?有没有更好的方法来实现这一目标?谢谢。
---------------更新------------------
所以我已经更新了代码以使用std :: string和std :: getline:
std::string firstline;
std::getline(file, firstline);
当我尝试打印第一行的值时出现以下错误
$1 = Python Exception <class 'gdb.error'> There is no member named _M_dataplus.:
最佳答案
sscanf
要求输入字符串为null-terminated。您没有向其传递以null终止的字符串,因此它的行为不符合预期。
如建议的那样,最好使用std::getline
读取字符串并将std::string
转换为整数。
如果使用C ++ 11或更高版本,请进一步阅读here,否则请阅读here。