2015-06-09 3 views
0

У меня возникли трудности с пониманием приведения типов, и я пытаюсь улучшить свое понимание, назначив содержимое string массиву unsigned chars. Я ожидал, что код ниже будет напечатан true, но это не так.Как назначить строку unsigned char [] в C++

unsigned char a[10]={0,1,2,3,4,5,6,7,8,9}; 
     string b="5"; 
     if(a[5]==(unsigned char)atoi(b.c_str())){ 
       cout<<true<<endl; 
    } 

Что мне не хватает?

+3

Это очень, очень неясно, что вы просите. Вы ищете советы по правильному сравнению содержимого строки с содержимым массива символов? – jaggedSpire

+0

@jaggedSpire yes – girl71

+0

Не возражаете, если я отредактирую ваш вопрос, чтобы сделать это более понятным? – jaggedSpire

ответ

2

Ваш пример кода имеет один или несколько проблем с ним, если вы пытаетесь распечатать true. Сколько зависит от того, как вы пытаетесь это сделать. Мои первые два пункта применяются, если вы сравниваете текст с другим текстом. Если вы пытаетесь преобразовать текст в число и сравнить числа, игнорируйте их.

unsigned char a[10]={0,1,2,3,4,5,6,7,8,9}; // 1 
     string b="5"; 
     if(a[5]==(unsigned char)atoi(b.c_str())){ // 2 
       count<<true<<endl; // 3 
} 

1) В то время как это произведет массив беззнаковых символов, они не будут текстовые значения. Значения в этом массиве являются первыми 10 ASCII characters, а не символами, которые производят от 0 до 9 при печати. Эти символы могут быть помещены в ваш массив с кодом:

unsigned char a[10]={'0','1','2','3','4','5','6','7','8','9'}; 

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

2) Вы правы, что a[5] получит доступ к шестому элементу a. Если вы сравниваете текстовые значения, а не числовые значения, вам нужно только получить доступ к первому элементу вашей строки для сравнения. Указано, что строка содержит не менее 1 элемента. Поскольку вы определили его чуть выше этого кода, это нормально, но в случае ввода пользователя вам нужно будет проверить. Правильный синтаксис для этого сравнения, как указано deviantfan, равен a[5] == b[0], потому что оператор [] на strings вернет char.

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

3) Вы не разместили кавычки вокруг true. Хотя это будет компилировать и даже печатать что-то - это не будет true, если не будет выполнено несколько условий, которые вряд ли вы встретите в начале своей карьеры кодирования. То, что вы, вероятно, хотели поставить, - «true», что сделает вывод корректным. Кроме того, вы хотите cout, а не count.

Здесь приведен пример link, который сравнивает строку и (модифицированный) символьный массив как текстовые данные. Если вы сравниваете числовые данные, единственное, что не соответствует вашему коду, - это 3).

+0

если укус ** b ** есть больше char, что делать ?? – girl71

+0

Это зависит полностью от того, что вы * хотите * сделать. Если вы сравниваете больше символов с предопределенными значениями, просто используйте сравнение значений 'char', указанных выше, но с разными индексами. Если вы хотите сравнить строку с числом, это немного другая проблема, хотя вы можете сделать это таким образом. Если вы сравниваете несколько символов подряд, я бы сделал что-то еще. Вы можете определить строку символа с помощью символа 'char mychararr [] =" 123 "', а затем использовать функцию-член класса 'string', чтобы найти это значение в строке, где вы храните пользовательский ввод. – jaggedSpire

+0

@ girl71: Этот ответ серьезно вводит в заблуждение. Ваш код почти работал до того, как jaggedSpire заставил вас его редактировать - единственная проблема заключалась в том, что он напечатал '1' вместо' true'. Это описано в третьем пункте jaggedSpire. Но, на мой взгляд, первые два момента совершенно неправильны. – TonyK

0

Если you're уверены, что ваша строка b имеет ровно один символ:

char c = b[0]; 

Вот и все.

atoi не извлекает символы, а анализирует численное содержимое на целые числа.

0

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

#include <iostream> 
#include <string> 

int main() { 
    unsigned char a[10]={0,1,2,3,4,5,6,7,8,9}; 
    std::string b="5"; 
    std::cout<<std::boolalpha<<(std::to_string(a[4])==b)<<std::endl; 
    std::cout<<std::boolalpha<<(std::to_string(a[5])==b)<<std::endl; 
    return 0; 
} 

http://ideone.com/9cvce4