2012-06-24 111 views
1

我很困惑为什么cout语句不在函数find_depth中打印数组c_braces_array的内容;Visual Studio(std :: cout)不打印我的变量值

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

#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按任意键继续。 。 。

enter image description here

编辑: 我初始化数组包含在主全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
内部主:一个
val为:AX
val为:X
val为:X
val为:X
val为:X
val为:X
val为:X
val为:X

+2

字符“0”是一个空终止符,用于结束字符串,而不是“0”,它的ASCII值为“48”。你也不应该使用'system(“pause”)',因为你不能保证别人计算机上的'暂停'程序会做什么。 – chris

+0

这是,但你的数组是空的。 – Ryan

+0

由于您已将'braces'数组初始化为全0,它将打印'no_of_braces'空字符串。 –

回答

2

看来你的大部分问题得到了答复,但为了完整起见,让我们回顾一下。

  1. 为什么没有打印的原因是因为您已将阵列初始化为包含所有0值。 A 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();,这是<string.h>的一部分。这会将每个元素设置为给定的值,对于您的情况可能是您需要的。这是像这样做:

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

希望这有助于!仅仅练习和使用C字符串来更好地理解它们可能是有用的。只需注意,'0'0之间存在差异,0只是零的值,而'0'是零字符的字符值。 (阅读:48)。因此,如果要将memset打印为0,则必须使用memset(myArray, '0', 100);

0

它试图打印变量v ALUE。该值为0,这不是'0'。 0不是可打印的字符,因此不能打印任何内容。

+0

为什么0不是可打印的字符? – ZERO

2

尝试:

​​
+3

你拼错'static_cast'。另外,要看OP如何打印数组的内容,最好将数组更改为保存正确的值,而不是将每个数组转换为输出。 – chris

+2

哈哈。谁错过皮尔特? –

+0

当你打我的时候。我还会补充一点,如果目标是在数组的每个索引处打印VALUE(而不是char),则转换为int实际上就是您应该做的(如Rafael所示),无论您是使用static_cast (c_braces_array或者拉法尔演出的C风格演员。但是,如果您的目标是在数组中打印ASCII字符,那么chris是正确的,您应该将一些ASCII字符实际写入数组,而不是将它全部设为零。 – phonetagger