2012-06-24 2 views
1

Я настолько смущен, почему инструкция cout не печатает содержимое массива c_braces_array в функции find_depth;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:

...
Допустимо: F
Допустимо: F
Допустимо: F
Допустимо: F
Допустимо: F
0Нажмите любую клавишу для продолжения. , ,

enter image description here

Edit: Я инициализируется массив содержит все 0s в главном. Поэтому я ожидал печати 0. Я не уверен, что вещь O (как в Oh!) Входит в контекст. Может кто-нибудь объяснить немного больше об этом?

Я ожидал этого о/р

Вэл: 0 F

Edit - 2: Ребята спасибо. Спасибо, что указали на ошибку. Также я не понимаю, почему следующая строка инициализирует только фигурные скобки [0] с 'a' вместо всего массива. Каков правильный способ инициализации всего массива вместо запуска цикла 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
Внутри главный: а
Допустимо: аХ
Допустимо: Х
Допустимо: Х
Допустимо: Х
Допустимо: Х
Допустимы : X
Допустимы: X
Допустимы: X

+2

Символ '0' является нулевым терминатором, используемым для завершения строк, в отличие от' '0'', который имеет значение ASCII '48'. Вы также не должны использовать 'system (" pause ")', поскольку у вас нет гарантий того, что сделает программа '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

Try:

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

Вы ошибаетесь 'static_cast'. Также, видя, как OP хочет распечатать содержимое массива, было бы лучше изменить массив, чтобы удерживать правильные значения вместо того, чтобы кастовать каждый для вывода. – chris

+2

lol. кто скучен? –

+0

Dang вы меня избили. Я также добавлю, что если цель состоит в том, чтобы напечатать значение VALUE (не char) в каждом индексе массива, кастинг в int действительно то, что вы должны делать (как показывает Рафаэль), используете ли вы 'static_cast (c_braces_array [i]) 'или в стиле C, как показывает Рафаэль. Однако, если ваша цель состоит в том, чтобы напечатать ASCII-символы в массиве, то крис прав, что вы должны на самом деле написать некоторые символы ASCII в массив, а не просто сделать все нули. – phonetagger

Смежные вопросы