2010-09-21 4 views
0

Моего кода в основном это список ASCII кодовых строк, которая вводится, мой следующий код прост, здесь:C++: Печать/назначая простые отпечатки массива тарабарщины

#include <iostream> 
#include <string.h> 

using namespace std; 

int main() { 
    char str[20]; 
    int result[20]; 
    cin >> str; 

    for(int i = 0; i != strlen(str); i++) { 
     result[i] = (int)i; 
    } 

    for(int i = 0; i != 20; i++) 
     cout << result[i] << ", "; 
} 

, когда я запустить его, независимо от того, что вход выводит кучу бреда, как неопределенную память так:

0, 1, 2, 3, 4, 5, 1, -1217349408, -1220040795, -1220041307, -1076427112, 134514781, -1218903292, 134519344, -1076427096, 134514004, -1217411568, 134519344, -1076427048, 134514681, 

я упускаю что-то простое в том, как я добавляю каждое целое число в массив?

Просто обратите внимание, что это простой пример, мой ввод не должен превышать 20 символов.

EDIT опечатка в моем результате .. CIN >> результат CIN >> ул

+2

Массивы с фиксированным размером? Мои глаза болят! Используйте 'std :: string' в C++. – fredoverflow

+0

Не используйте strlen в состоянии выхода из цикла - v неэффективно, чтобы сделать этот вызов для каждого цикла. Храните strlen как локальный первый, так как строка инвариантна внутри цикла. –

ответ

2

Этот цикл будет повторяться несколько раз, равный длине 'str'. То есть, он будет перебирать один раз для каждого символа в 'str' и останавливаться на «нулевом терминаторе» (значение char 0), которое заканчивается c строк. В каждом цикле значение «i» - это номер цикла, начиная с 0 - и это значение, которое вы присваиваете этому индексу в массиве результатов.

for(int i = 0; i != strlen(str); i++) { 
    result[i] = (int)i; 
} 

Так, например, для строки длиной 5, вы будете присвоить значения «0, 1, 2, 3, 4» в массив результата на этих индексах, соответственно. Другие значения в массиве результатов не назначаются - и поэтому могут содержать любое значение (как правило, все, что было в этом бите памяти, прежде чем вы начнете его использовать). Если ваша строка длиннее 20 символов, у вас проблемы, потому что вы начнете пытаться получить доступ к массиву с индексом 20 и выше, что не является памятью, принадлежащей вашей программе.

Этот цикл выводит все значения в массиве «результат», от значения с индексом от 0 до значения в индексе 19:

for(int i = 0; i != 20; i++) 
    cout << result[i] << ", "; 

Так будет печататься инициализированы значения, и, если строка была меньше 20 символов, а также неинициализированные значения.

как минимум, чтобы начать получать что-либо как результаты вы после этого, вы хотите изменить

result[i] = (int)i; 

в

result[i] = str[i]; 

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

for(string::iterator i = str.begin(); i != str.end(); i++) 
    // access char here using '*i' 
+0

СПАСИБО, это так поздно, все время делал ошибку в моем OP. Это была глупая ошибка. Благодарю. – John

0

Вы не инициализирован str и вы принимаете его strlen

Когда вы сделали

cin >> result; // this does not even compile!!! 

Я думаю, вы имели в виду

cin >> str; 

Непонятно, что вы пытаетесь сделать. Но вы можете попробовать это, чтобы получить какой-то значимый результат:

char str[20]; 
int result[20] = {0}; 
cin >> str; 
...// rest all unchanged. 
+0

Наряду с моим редактированием .. Как инициализировать? 'char str [20] = {" "}; int result [20] = {0};', я не уверен, как инициализировать массивы. Мой результат составляет 20 или около того нулей с несколькими номерами, может быть, это ошибка, которую я присвоил массиву. – John

1

strlen(str) даст вам неопределенный выход, потому что вы не инициализированы содержимому str[].

0

stlen(str) будет указывать количество символов до нулевого терминатора.

Это означает, что действительны целые числа strlen(str). Остальные неинициализированы.

Также: взгляните на std::transform. Вы можете избежать временного массива целых чисел, чтобы достичь того же, или transform прямо в одном.

int to_codepoint(char c) { return (int) c; } 


// ... 
char cs[] = "abcd"; 
std::transform(cs, cs+strlen(cs) 
      , std::ostream_iterator<int>(std::cout, ", "), to_codepoint); 

// or transform into an array: 
int is[ 1000 ]; // 1000 enough? 
std::transform(cs, cs+strlen(cs) 
       , is, to_codepoint); 

(test code at codepad.org)

1

У вас есть 3 проблемы:

  1. Вы не Initialise str с соответствующей строки, таким образом, strlen возвращает непредсказуемое значение.
  2. Вы инициализируете первые strlen(str) позиций result, но позже вы печатаете его до индекса 20. Вы должны использовать то же условие для обеих петель.
  3. Вы должны обязательно использовать std::string и его итератор.
+0

И вы, вы не можете рассчитывать. Но 2, кажется, ответ: – xtofl

+0

@xtofl: oops, действительно забыл обновить счет. Благодаря! – jweyrich

1

По сути, вы не смогли правильно инициализировать строку, и вы не отметили, что это правильный размер.Правильный код:

#include <iostream> 
#include <string> // NOT <string.h>, <string> 

int main() { 
    std::string str; 
    std::cin >> str; 
    std::cin.ignore(); 
    for(std::string::iterator it = str.begin(); it != str.end(); it++) { 
     std::cout << (int)(*it); 
     if (it + 1 != str.end()) 
      std::cout << ", "; 
     else 
      std::cout << "\n"; 
    } 
    std::cin.get(); 
} 
Смежные вопросы