如何检查char变量是否为空?
我的意思是,使用类似finally
的字符串检查方法,如果字符串不包含任何字符empty()
,则结果为true。如何检查char变量是否不包含字符?
例如,我有这样的代码:
stringVar.empty()
此代码不正确,我也不知道如何以一种很好的方式解决问题,我发现了一件能让我绕过该问题的小东西,但这并不完美。目前,我正在使用:
// all libraries are included before and code is simplified because it is very long
std::fstream file;
char mychar;
file.open("userselectedfile.txt", std::fstream::in);
if (file.is_open() == true) {
while (file.eof() != true) {
// check if mychar is initialized yet (first time that the while execute)
if (mychar == '') {
mychar = file.get();
// do something special beacuse mychar wasn't initialized
// do something with other files
} else {
mychar = file.get();
// do something else with other files
}
}
}
file.close();
这是检查mychar是否尚未初始化的唯一方法吗?如果可以检查mychar是否尚未初始化但与上面的函数不同,我该使用哪些函数?
软件目标:在这种特定情况下,我正在构建的程序旨在删除用户(我的原因是我的)提交的编码源代码文件中的所有注释,因此我可以不要使用特殊字符,因为它可以出现在文件中,使用std::fstream file;
char mychar;
file.open("userselectedfile.txt", std::fstream::in);
if (file.is_open() == true) {
for (int i = 0; file.eof() != true; i++) {
if (i = 0) {
mychar = file.get();
} else {
mychar = file.get();
}
}
}
file.close();
是个不错的主意,但我希望还有其他字符。当我在程序中编写\0
时,我会继续读取字符,直到找到注释,然后在不使用注释创建新文件时忽略它们。
BOM:不,我测试的文件并没有给我带来错误,因为该算法有一些错误,但不是我要求的部分。
答案 0 :(得分:7)
你不能。
在C ++中,未初始化的变量具有未指定的值,并且以任何方式读取它们都是未定义的行为,因此您甚至无法检查其中的内容。
您有三个选择:
\0
可能适合您的情况。std::optional<char>
。答案 1 :(得分:3)
一个字符永远不会为空。 即使您不初始化它,它始终包含一个值。如果不初始化,则无法假设任何特定的值,因此您要问的基本上是不可能的。
实际上,您可以将一个char初始化为NUL。按照惯例,您可以假装代表“空”值。完成此操作后,您可以测试一下char是否包含空值,并将其用作测试的基础。
char x = '\0'; // Initialize to 'empty' value
char y = 'a'; // Initialize to a 'non-empty' value
if (x == '\0') std::cout << "x is empty" << std::endl;
if (y == '\0') std::cout << "y is empty" << std::endl;
答案 2 :(得分:2)
std::fstream::get()
不返回字符,而是一个整数。除了其他人提供的解决方案之外,您可以使用int mychar = -1
并进行检查。
但是,我强烈建议您重新组织代码,这样就不必这样做了。实际上,如果您正确解析get()
的结果,则在使用get()
之前不需要(也不应该使用)额外的EOF检查。它精确地返回一个int值,以便在无法读取任何字符的情况下可以返回EOF
而不是char值。
最后,您还可以使用get()
的另一个重载,它将目标char作为这样的参数:
while (file.get(mychar)) { … }
答案 3 :(得分:1)
与其尝试确定是否尚未使用hwnd.postDelayed(5000){
// this : Handler, it : Runnable
postDelayed(it, 5000)
}
,而是让它重新构造循环以为您处理。如果使用for循环,则可以声明一个变量,我们可以使用该变量来跟踪它是否是循环的第一次迭代。这样会使代码看起来像
mychar
答案 4 :(得分:1)
如果您有一个可以保存或不保存值的变量,则std::optional
正是为此目的而制作的。例如:
#include <iostream>
#include <optional>
void print_or_not(std::optional<char> x){
if (x) std::cout << x.value();
}
int main() {
std::cout << "uninitialized \n";
std::optional<char> x;
print_or_not(x);
std::cout << "initialized \n";
x = 'x';
print_or_not(x);
}
打印
uninitialized
initialized
x
答案 5 :(得分:0)
您不能。如果您想在第一次执行循环时执行其他操作,请使用布尔值标志:
bool first = true;
while (file.eof() != true) {
if (first) {
// do something
first = false;
} else {
// do something else
}
}
如果您确实想要一个可能包含或不包含char值的变量,请使用std::optional<char>
。
答案 6 :(得分:-2)
您可以使用以下代码检查char变量是否未定义(未初始化):
char c;
if(c == NULL)
{
cout<<"Your character doesn't have any value";
}
else
{
cout<<"the character you entered is:" << c;
}