C ++如何检查char变量是否未定义(未初始化)

时间:2018-08-17 18:51:23

标签: c++ undefined

如何检查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是否尚未初始化但与上面的函数不同,我该使用哪些函数?

更新1

软件目标:在这种特定情况下,我正在构建的程序旨在删除用户(我的原因是我的)提交的编码源代码文件中的所有注释,因此我可以不要使用特殊字符,因为它可以出现在文件中,使用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:不,我测试的文件并没有给我带来错误,因为该算法有一些错误,但不是我要求的部分。

7 个答案:

答案 0 :(得分:7)

你不能。

在C ++中,未初始化的变量具有未指定的值,并且以任何方式读取它们都是未定义的行为,因此您甚至无法检查其中的内容。

您有三个选择:

  • 提供一个您在文件中不会遇到的值。 \0可能适合您的情况。
  • 使用单独的布尔变量来跟踪是否已阅读一次。
  • 在C ++ 17中,使用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;
}