【问题标题】:Visual studio (std::cout) not printing my variable valueVisual Studio (std::cout) 不打印我的变量值
【发布时间】:2012-06-24 20:21:37
【问题描述】:

我很困惑为什么 cout 语句没有在函数 find_depth 中打印数组 c_braces_array 的内容;

我要做的就是传递一个数组并打印它的值。

#include <iostream>

int find_depth(char c_braces_array[], int no_of_braces)
{
    for(int i=0; i<no_of_braces; i++)
    {
        std::cout<<"val is:"<<c_braces_array[i]<<"F\n";
    }
    return 0;
}

int main()
{
    char braces[100] = {0};
    int ret_val = find_depth(braces, 100);
    std::cout<<ret_val;
    system ("pause");
    return 0;
}

O/P:

...
val 是:F
val 是:F
val 是:F
val 是:F
val 是:F
0按任意键继续。 . .

编辑: 我将数组初始化为在主数组中包含所有 0。所以我期待 0 被打印出来。我不确定 O(如哦!)的事情在哪里出现。有人能解释一下吗?

我期待这个o/p

val 是:0 F

编辑 - 2: 伙计们谢谢。感谢您指出错误。 另外我不明白为什么下面的行只用'a'而不是整个数组初始化大括号[0]。什么是初始化整个数组而不是运行 for 循环的正确方法。

现在我的代码如下所示。

main(){
        ...
    char a_char = 'a';
    char braces[100] = {a_char};
      }

find_depth(..)
{
     ...
    std::cout<<"val is:"<<c_braces_array_ptr[i]<<"X\n";
}

O/P
内部主要:a
val 是:aX
val 是:X
val 是:X
val 是:X
val 是:X
val 是:X
val 是:X
val 是:X

【问题讨论】:

  • 一个字符 0 是一个空终止符,用于结束字符串,而不是 '0',它的 ASCII 值是 48。您也不应该使用system("pause"),因为您无法保证其他人计算机上的pause 程序会做什么。
  • 是,但是你的数组是空的。
  • 由于您已将 braces 数组初始化为全 0,它正在打印 no_of_braces 空字符串。
  • 出于好奇,您期望的输出是什么?

标签: c++ visual-studio-2010 cout


【解决方案1】:

您的大部分问题似乎都已得到解答,但为了完整起见,让我们回顾一下。

  1. 没有任何内容打印在您期望的位置的原因是因为您已将数组初始化为包含所有0 值。 0 是 c 字符串的空终止符,这意味着它标志着字符串的结尾。它也是一个非打印字符,我们不想以打印字符结束每个 c 字符串,这是没有意义的。如果你想要 ASCII 字符 0,你需要'0',它是十进制的48。 (参见:http://www.asciitable.com/
  2. 当用数据声明和初始化一个数组时,它将用初始化列表中的相应数据填充每个元素。例如; char myArray[10] = {'a', 'b', 'c'}; 将使用值 myArray[0] = 'a'; myArray[1] = 'b'; myArray[2] = 'c'; 初始化数组,但是所有其他元素呢?它不假设您想要重复一个元素,它还假设您不想要垃圾。相反,它会用 0 值填充数组。
  3. 我假设您的下一个问题可能是“我怎样才能用不同的值填充它?”如果不明确说明每个元素的每个值,就无法更改数组的初始化方式。 但是 - 你可以设置每个值。

    unsigned int i;
    char myArray[100]; // Don't waste time initializing any data yet.
    
    for(i = 0; i < 100; ++i)
    {
         myArray[i] = 'a'; // Set each element to 'a' - Now it's initialized!
    }
    

    另一种选择是使用memset();,它是&lt;string.h&gt; 的一部分。这会将每个元素设置为给定值,并且对于您的情况可能是您需要的。这样做是这样的:

    #include <string.h>
    
    char myArray[100]; // Declare, don't initialize.
    memset(myArray, 'a', 100); // Initialize by setting each value to 'a'!
    

希望这有帮助!练习和玩弄 c-strings 以更好地理解它们可能会很有用。请注意,'0'0 之间存在差异,0 只是零的值,而'0' 是零字符的字符值。 (阅读:48)。所以如果你想memset打印0,你必须memset(myArray, '0', 100);

【讨论】:

    【解决方案2】:

    试试:

    std::cout<<"val is:"<< (int)(c_braces_array[i]) <<"F\n";
    

    【讨论】:

    • 你拼错了static_cast。此外,鉴于 OP 希望如何打印数组的内容,最好更改数组以保存正确的值,而不是将每个值转换为输出。
    • 该死的你打败了我。我还要补充一点,如果目标是在数组的每个索引处打印 VALUE(而不是 char),那么无论您使用 static_cast&lt;int&gt;(c_braces_array[i]) 还是拉斐尔展示的 C 风格演员。但是,如果您的目标是打印数组中的 ASCII 字符,那么 chris 是正确的,您应该将一些 ASCII 字符实际写入数组而不是全为零。
    • static_cast 更好,因为它既明确又不会导致 C 样式转换可能出现的问题。来自 OP 的帖子:why the cout statement is not printing the contents of the array。这让我相信'0' 的内容会比0 更好。
    • 仅仅因为一个特性的存在并让代码变得稍微安全一些,并不意味着如果它是可怕的就应该使用它,static_cast 就是这样。
    【解决方案3】:

    它正在尝试打印您的变量值。该值为 0,不是'0'。 0 不是可打印字符,因此无法打印任何内容。

    【讨论】:

    • 为什么 0 不是可打印字符?
    猜你喜欢
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多