在ASCII中-1代表什么? 我在C++类中研究自动文摘系统,并且对我正在做的一个ASCII比较有问题。代码如下: char ch; string sentence; pair<char, char> sentenceCheck; int counter = 0; while (!ifs2.eof()) { ch = ifs2.get(); ch = tolower(ch); if (ch == 13) ch = ifs2.get(); if (ch != 10 && ch != '?' && ch != '!' && ch != '.') sentence += ch; sentenceCheck.first = sentenceCheck.second; sentenceCheck.second = ch; cout << sentenceCheck.first << "-" << (int)sentenceCheck.first << " ---- " << sentenceCheck.second << "-" << (int)sentenceCheck.second << endl; if(sentenceCheck.second == ' ' || sentenceCheck.second == 10 || sentenceCheck.second == -1) { if(sentenceCheck.first == '?' || sentenceCheck.first == '!' || sentenceCheck.first == '.') { istringstream s(sentence); while(s >> wordInSentence) { sentenceWordMap.insert(pair<string, int>(wordInSentence, 0)); } //sentenceList.push_back(pair<string, int>(sentence, 0)); sentence.clear(); } } } charch; 串句; 配对句子检查; int计数器=0; 而(!ifs2.eof()) { ch=ifs2.get(); ch=托洛尔(ch); 如果(ch==13) ch=ifs2.get(); 如果(ch!=10&&ch!='?'&&ch!='!'&&ch!=') 句子+=ch; sentenceCheck.first=sentenceCheck.second; sentenceCheck.second=ch; CUT< P> 1不代表ASCII中的任何东西。所有的ASCII代码都在范围[0, 127 ]中。它甚至不被C++所保证, -1 < /C> >是 char < /> >的有效值。< /P>
问题在于,您没有检查来自在ASCII中-1代表什么? 我在C++类中研究自动文摘系统,并且对我正在做的一个ASCII比较有问题。代码如下: char ch; string sentence; pair<char, char> sentenceCheck; int counter = 0; while (!ifs2.eof()) { ch = ifs2.get(); ch = tolower(ch); if (ch == 13) ch = ifs2.get(); if (ch != 10 && ch != '?' && ch != '!' && ch != '.') sentence += ch; sentenceCheck.first = sentenceCheck.second; sentenceCheck.second = ch; cout << sentenceCheck.first << "-" << (int)sentenceCheck.first << " ---- " << sentenceCheck.second << "-" << (int)sentenceCheck.second << endl; if(sentenceCheck.second == ' ' || sentenceCheck.second == 10 || sentenceCheck.second == -1) { if(sentenceCheck.first == '?' || sentenceCheck.first == '!' || sentenceCheck.first == '.') { istringstream s(sentence); while(s >> wordInSentence) { sentenceWordMap.insert(pair<string, int>(wordInSentence, 0)); } //sentenceList.push_back(pair<string, int>(sentence, 0)); sentence.clear(); } } } charch; 串句; 配对句子检查; int计数器=0; 而(!ifs2.eof()) { ch=ifs2.get(); ch=托洛尔(ch); 如果(ch==13) ch=ifs2.get(); 如果(ch!=10&&ch!='?'&&ch!='!'&&ch!=') 句子+=ch; sentenceCheck.first=sentenceCheck.second; sentenceCheck.second=ch; CUT< P> 1不代表ASCII中的任何东西。所有的ASCII代码都在范围[0, 127 ]中。它甚至不被C++所保证, -1 < /C> >是 char < /> >的有效值。< /P>,c++,ascii,C++,Ascii,问题在于,您没有检查来自ifs2.get()的返回值,该函数返回的int(不是char!)可能是文件末尾的-1。正确的检查方法是 int ch = ifs2.get(); if (!ifs2) // break the loop 因为EOF值不能保证是-1(实际上是std::char\u traits::EOF()) (顺便说一句,你不应该把ASCII码写成幻数;用\n换行,用\r换行。)这不是ASCII码,是由 它可能是EOF,即您已经用完了输入。while的结构不正确:您需要在ge
ifs2.get()
的返回值,该函数返回的int
(不是char
!)可能是文件末尾的-1
。正确的检查方法是
int ch = ifs2.get();
if (!ifs2)
// break the loop
因为EOF值不能保证是-1
(实际上是std::char\u traits::EOF()
)
(顺便说一句,你不应该把ASCII码写成幻数;用
\n
换行,用\r
换行。)这不是ASCII码,是由
它可能是EOF,即您已经用完了输入。while的
结构不正确:您需要在get()
之后立即检查EOF()
:
-1
可能是EOF指示器
注意(如前所述)返回一个int
,而不是char
,因为ASCII字符-1不代表任何东西(也就是说-1不是有效的ASCII值)。get()的返回值表示读取操作失败-很可能是由于到达文件结尾
请注意,如果下一个get调用由于到达文件结尾而失败,则eof()函数不会返回true。如果上一个get调用由于到达文件结尾而失败,则eof()函数将返回true。检查-1的工作是一个意外,没有任何问题
请使用ASCII值(仅使用0
到127
),您的代码将失败
如果任意一个纯字符是无符号的(我想用VC++用/J
编译),
或者EOF
不是-1(很少见,但可以保证的是它是-1)
负数)。如果输入恰好是正确的,您的代码也将失败
拉丁语-1,它包含一个“ÿ”
代码中的基本问题是没有检查代码的结尾
正确归档。将测试放在循环的顶部不起作用;
在使用之前,您需要在输入之后测试故障(而不是eof()
)
有几种方法可以做到这一点;在您的例子中
最简单的方法可能是使用:
if ( !ifs2.get(ch) ) {
// Input failed...
}
或者,您可以将ch
设置为int
,并执行以下操作:
ch = ifs2.get();
if ( ch == EOF ) {
// Input failed...
}
这样做的好处是不再需要执行以下对tolower
的调用
未定义的行为(tolower
采用int,必须在范围内
[0…UCHAR\u MAX]
或EOF
-如果已对纯char
签名,则您没有签名
另一方面,它不允许链接,即。
您不能编写与以下内容等效的内容:
while ( ifs2.get( sentenceCheck.first )
&& ifs2.get( sentenceCheck.second ) ) {
// ...
}
(在某些情况下可能有用)
FWIW:您使用的技术称为滑动窗口
把它放到一个单独的类中是值得的
处理保持窗口填充和更新的逻辑。
或者,可以使用一个简单的状态机来解决您的问题
我绝对不会使用魔法常数:如果你想检查
回车符,与'\r'
比较。同样,换行符是'\n'
,
在外部的if
中,看起来您想要检查空白
(isspace(static_cast(sentenceCheck.second))
),
而不是比较价值
我还想补充一点,您的代码无法正确处理
以引号结尾,如这是“输入中的文本”。
;它也是
琼斯先生在这里。
。但是这些问题
可能超出您的任务范围。(缩写为one)
可能无法完全解决:有时“等等”
是一个问题的结束
ASCII非扩展只有7位,您应该使用if(!ifs2)检查失败模式和EOF。此外,对于未来,大多数计算器都有程序员模式(至少是Windows、Mac、GNOME和KDE)。我认为它们都有某种ASCII中显示的
按钮。+1,事实上。OP应该是在int
中收集返回值,而不是'char'。一个常见的缩写是while(ifs2>>ch){/*process char*/}
ch = ifs2.get();
if ( ch == EOF ) {
// Input failed...
}
while ( ifs2.get( sentenceCheck.first )
&& ifs2.get( sentenceCheck.second ) ) {
// ...
}