1不代表ASCII中的任何东西。所有的ASCII代码都在范围[0, 127 ]中。它甚至不被C++所保证, -1 < /C> >是 char < /> >的有效值。< /P>,c++,ascii,C++,Ascii" /> 1不代表ASCII中的任何东西。所有的ASCII代码都在范围[0, 127 ]中。它甚至不被C++所保证, -1 < /C> >是 char < /> >的有效值。< /P>,c++,ascii,C++,Ascii" />

在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 ) ) {
    //  ...
}