Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Сравнить содержимое буфера с 0x01 
V
    Опции темы
Elyad
Дата 10.10.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Помогите отладить простенькую прогу.
Надо содержимое буфера сравнить с 0x01 и записать yes  в случае совпадения.
Код

    char s[2];
    int n=0x01, d;
    
    strcpy(s,"0x01\n");
    d=atoi(s);
    if (d==0x01)  puts("yes");
    else puts("no");


   или 
Код

    char s[2];
    strcpy(s,"0x01\n");
    if (s[0]==0x01)   puts("yes");
    else puts("no");

     почему все время при запуске выдает  :   no


Модератор: для выделения кода следует использовать конпку "КОД"



Это сообщение отредактировал(а) alexeis1 - 10.10.2006, 14:06
PM MAIL   Вверх
EvgenZ
Дата 10.10.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



atoi возвращает целое число, если не ошибаюсь по основанию 10. Может я туплю )))
во втором случае ты сравниваешь строку с числом.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
likehood
Дата 10.10.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 12
Всего: 24



В данном случае (как я понял) s это не строка, а просто массив байтов.
Имеется ввиду, что в буфере s первый байт =1, а второй байт =0.
Порядок байтов обратный, таково представление в памяти целых чисел.
Код

char s[2] = { 1, 0 }; // байты в памяти распологаются в обратном порядке
int n=0x01; // считаю для простоты, что sizeof(int)==2
if (*( (int*)s ) == n) puts("yes");

PM MAIL   Вверх
FiMa1
Дата 10.10.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: нет
Всего: 6



Код

char s[] = {1, 0};
    
for (int i=0; i<sizeof(s); i++) {
   if (s[i]==0x01) { cout << "yes \n"; }
   else  { cout << "no \n"; }
}

PM   Вверх
bsa
Дата 10.10.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 1
Всего: 196



Elyad
Во-первых, в строке "0x01\n" 5 символов. Для ее хранения требуется буфер на 6 символов, а у тебя на 2 байта.
Во-вторых, если тебе необходимо сравнивать строки, то используй strcmp. Если же тебе надо, чтобы в строке могло быть и "001", и "1", и "0x01", то тогда используй atoi.
Код
#include <iostream>
#include <cstring>
#include <cstdlib>
main() {
   char s[6];
   strcpy(s, "0x01\n");
   if (s[strlen(s)-1] == '\n')
       s[strlen(s)-1] = '\0';        //обнаружен символ конча строки - заменяем на \0, чтобы он не учавствовал в сравнении.
   if (!strcmp(s, "0x01"))
       std::cout << "0x01 - yes" << std::endl;
   else
       std::cout << "0x01 - no" << std::endl;
   if (atoi(s) == 1)
       std::cout << "1 - yes" << std::endl;
   else
       std::cout << "1 - no" << std::endl;
}

В результате работы должно быть: 
Код
0x01 - yes
1 - yes


atoi - это функция, которая из строки делает число, если это возможно, конечно. Т.е. если у тебя строка содержит "0x01", то atoi вернет 1.
PM   Вверх
_stranger_
Дата 10.10.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 3.10.2006
Где: город-герой Киев

Репутация: нет
Всего: 2



я бы предложил так организовать сравнение

Код

    char s[5];
    int d;
    
    strcpy(s,"0x01");
    sscanf(s,"%x",&d);
    if (d==0x01)  puts("yes");
    else puts("no");


Модератор: для выделения кода следует использовать конпку "КОД"
Это относится ко всем участникам


Это сообщение отредактировал(а) alexeis1 - 10.10.2006, 15:54
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.