从文本文件中读取时,即使不存在,也会找到额外的字符(例如"@")?
while reading from the text file is finding extra character (ex.'@') even if it is not there?
这是我的代码:在这种情况下,我得到的"@"与文件中的"@"冲突
ifstream file("text.dat");
if(file.is_open()){
bool flag=false;
在这里我得到了一个额外的角色
getline(file,str,'n');}
这是文本文件,我正在从这个文本文件中读取!
吉姆工作室 5 很酷哈利@jim现在正在为研讨会5工作克里斯戴夫什么^#$%!约翰@harry 我完了
std::string::find(( 如果未找到该字符,则返回std::string::npos
,并且 std::string::npos
是表示字符串最大大小的常量。这是你看到的巨大数字。
您的if
语句应如下所示:
if(std.find('@') != std::string::npos)
{
//blabla
}
查看程序的输出:
"@"在这里!!!:18446744073709551615
18446744073709551615
是str.find("@")
返回的值。 如果找到子字符串,find()
返回子字符串的索引,否则返回 std::string::npos
,定义为-1
强制转换为 std::string::size_type
,这是一个无符号类型。 在本例中,size_type
是一个 64 位数字,因此在返回 npos
时,您最终会得到索引18446744073709551615
。
任何非零值都将在布尔表达式(如 if
语句(中计算为 true。 这就是为什么你最终设置flag=true
. 这是代码中的错误,原因有两个:
-
当
find()
根本没有找到匹配项时,您的评估为 true。 -
当
find()
在位置 0(字符串的第一个字符(找到匹配项时,您的计算结果为 false。
您需要更改此设置:
if(str.find("@")) flag=true;
对此:
if(str.find("@") != string::npos) flag=true;
或者简单地说:
flag = (str.find("@") != string::npos);
std::string::find()
返回 std::string::npos
如果找不到指针,则npos
的值为 -1,这被强制为布尔值 true,而不是 false。
您需要直接将find()
的结果与npos
进行比较,而不是执行隐式强制。
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 如何返回一串字母数字字符中的最大值(例如-1A003B3)?
- 数组打印奇怪的字符,例如 ∟ @
- 这个字符数组应该如何?(例如C++游览)
- 从文本文件中读取时,即使不存在,也会找到额外的字符(例如"@")?
- C++降低特殊字符,例如 ü
- 将字符数复制到新字符串位置的字符串操作,例如 S[0]
- 如何将常量字符* []隐藏到单个内存块,例如char* ptr
- 在Java中读取字符,例如C
- 在没有字符串或字符帮助的情况下查找数字的反面(例如:2500 reverse 0025)
- c++Unicode字符串与易混淆字符的比较.例如(U 0054)应为==(U03A4)等
- 如何谷歌奇怪的字符,例如"~"内部问题,例如在构造函数之前的 c++ 中这意味着什么?
- 是否可以在 boost::ireplace 中将特殊字符视为基本字符?(例如。 'ź'为"z")
- 反转字符串中的每个字符,特殊字符除外(例如 "?" )
- 如何检查文本文件是否只包含某些字符(例如's'、'f'、#39;#'、'
- 如何更改用户输入字符,例如。"abcDEF"并返回输出"222333"