Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
#1

Преобразование строки в число - C++

20.04.2014, 21:15. Просмотров 1063. Ответов 23
Метки нет (Все метки)

Вот код из учебника
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using std::cout;using std::endl;
int main(){
    char str[]="0123456789";
    const int SIZE=10;
    int arr[SIZE]={0}, index=0;
    for (char *p=str; *p;++p){
        if (*p>='0' && *p<='9') {
            arr[index]=*p-'0';//вычитаем код символа числа ноль получаем искомое число
            ++index;
            if (index>=SIZE) break;
        }
    }
    for (int i=0;i<SIZE;i++){
        cout<<arr[i]<<endl;
    }
    system("pause");
    return 0;
}
мне все понятно кроме 2 вещей
C++
1
2
3
4
int arr[SIZE]={0}// левая часть понятна, а что присваивается в правой?
(char *p=str; *p;++p)/*Указателю p  мы присваиваем адрес массива str, вот строчка
 делать до указателя р мне не понятно(когда и почему закончится программа). 
И почеу мы увеличиваем просто р, а например не указатель?*/
И еще глупый вопрос всякие функции преобразования строки в число(atoi,strtol и т.п.) будут работать в юникоде?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2014, 21:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразование строки в число (C++):

Преобразование строки в число - C++
Имеется переменная строкового типа string. У нее такой формат: 1561 1 6.87208 4.52665 0.10226 2.16762 Нужно написать такую функцию,...

Преобразование строки в число - C++
А как многоразрядные числа из строки преобразовать? Если я использую string?

Преобразование строки в число - C++
Есть строка с цифрами разделенная точкой с запятой: 1, 2, 3 string s = &quot;1, 2, 3&quot;; Как мне из этой строки достать по очереди все цифры и...

Преобразование строки в число - C++
Почему не работает функция StrToInt, хоть библиотеку подключил stdlib.h

Преобразование из строки в число - C++
только начала программировать на С. то есть, буквально только что открыла 10й Билдер))) такой вопрос: есть ли в С Билдере функция...

Преобразование строки в число - C++
задача : реализовать деление двух целых чисел, передаваемых функции в виде строк Всем добрый вечер. Прошу ваших советов и подсказок....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,228
Завершенные тесты: 1
20.04.2014, 21:45 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
int arr[SIZE]={0}
нулевому элементу массива присваивается ноль.
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
for(char *p=str; *p;++p)
указателю p присваивается адрес начала массива str.
*p значение символа по текущему адресу. Когда указатель дойдет до признака конца строки,
то это будет ноль (соответственно проверка дасть ложь)
++p - переход к адресу следующего символа
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
20.04.2014, 21:47  [ТС] #3
zss,
Цитата Сообщение от zss Посмотреть сообщение
нулевому элементу массива присваивается ноль
а почему в фигурных скобках? а про функции они в юникоде работать будут вы не в курсе?
zss
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,228
Завершенные тесты: 1
20.04.2014, 22:07 #4
Для уникода есть функции с суффиксом w
для atol:
_UNICODE defined
_wtol
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
20.04.2014, 22:10  [ТС] #5
zss, ну то что все кроме нуля дают истину я знаю. Но здесь нулевой элемент массива это число 0. Почему проверка тут не дает ложь? или цикл for выполняется хотя бы 1 раз? И как программа отличает что это знак конца записи, а не просто число 0?
zss
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,228
Завершенные тесты: 1
20.04.2014, 22:28 #6
Проверяется массив str (а не arr), у которого ноль стоит на 11 позиции после буквы '9'
А список инициализации я бы написал такой
C++
1
int arr[SIZE]={0,0,0,0,0,0,0,0,0,0};
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
20.04.2014, 22:37  [ТС] #7
zss, извините если я туплю, но я про str и говорил. У него и на нулевой позиции тоже 0.
C++
1
char str[]="0123456789";
Добавлено через 4 минуты
Цитата Сообщение от zss Посмотреть сообщение
Код C++
1
int arr[SIZE]={0,0,0,0,0,0,0,0,0,0};
А смысл? мы точно знаем количество цифр их 10? Вот мы сразу на последний (10) элемент и записываем 0.
zss
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,228
Завершенные тесты: 1
20.04.2014, 22:41 #8
Этот нуль - это буква '0', а на 11 позиции стоит число ноль (или, если хотите, буква '\0').
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
20.04.2014, 22:58  [ТС] #9
zss, про инициализацию я запутался слишком привык к паскалю и делфи)) потом разберусь. если что уточню. Ладно чем отличается ноль от знака конца строки я понял, но осталась все равно не понятна маленькая деталь. Я понимаю, что за долбал вас глупыми вопросами, но кое что еще не понятно. Вот пример
C++
1
if (x) break;
в этом примере если х=0 это ложь, во всех остальных случаях истина.
Цитата Сообщение от zss Посмотреть сообщение
*p значение символа по текущему адресу
т.е *p==0 почему дает истинну а не ложь?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.04.2014, 23:03 #10
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
т.е *p==0 почему дает истинну а не ложь?
нук переведи
по адресу на который указывает указатель лежит 0
0==0 это истина
а если бы лежал не 0 то была бы ложь

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
нулевому элементу массива присваивается ноль.
не могу утверждать, но по моему всем элементам присвоится 0
по крайней мере я так загонял в массивы, элементов так в 100, значения
правда массивы были глобальные
проверить сейчас не могу
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
20.04.2014, 23:08  [ТС] #11
ValeryS, вы не поняли мой вопрос.
C++
1
2
3
4
char str[]="0123456789";
const int SIZE=10;
    int arr[SIZE]={0}, index=0;
    for (char *p=str; *p;++p)
при первом проходе функции получаем
C++
1
for (char *p=str; 0;++p)
Ноль же вроде должен давать ложь?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.04.2014, 23:22 #12
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
вы не поняли мой вопрос.
это кто писал
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
*p==0 почему дает истинну а не ложь?
вот на это я и ответил
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
при первом проходе функции получаем
C++
1
for (char *p=str; 0;++p)
с какого перепугу?
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
C++
1
2
3
char str[]="0123456789";
.......
for (char *p=str; *p;++p){
в str лежит вот такая последовательность
0х30(это символ 0) 0х31 0х32 0х33 0х34 0х35 0х36 0х37 0х38 0х39 0х00(вот он 0 конец строки )
т.е при первой итерации(проходе) цикла(а не функции)
*p равно 0х30
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
20.04.2014, 23:36  [ТС] #13
Цитата Сообщение от ValeryS Посмотреть сообщение
это кто писал
я для предыдущего отвечающего так не удачно старался объяснить что я от него хочу. Т.е. код элемента в типе char храниться в 16-ной системе, если я вас правильно понял.
C++
1
if (x) break;
А почему такая запись "прокатывает"
Цитата Сообщение от ValeryS Посмотреть сообщение
(проходе) цикла(а не функции)
Да мозг уже не варит, из-за это циклы и функции смешались))

Добавлено через 1 минуту
x типа integer
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
21.04.2014, 00:22 #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
Т.е. код элемента в типе char храниться в 16-ной системе, если я вас правильно понял.
все данные внутри компьютера хранятся в виде двоичных чисел
а вот как их интерпретировать это уже дело другое С позволяет общаться с десятичными, восьмеричными, шестнадцатеричными числами и с символами( речь про целочисленные типы в частности char)

0х30, 48, 060, '0' это одно и тоже в памяти будет как 0010 0000(двоичное)
так же эти числа могут интерпретироваться и как данные и как код (архитектура фон Неймана)
или по разному данные/код (гарвардская архитектура)
но это тема отдельного разговора
вот если интересно
http://ru.wikipedia.org/wiki/Архитектура_фон_Неймана
http://ru.wikipedia.org/wiki/Гарвардская_архитектура
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
А почему такая запись "прокатывает"
такая это какая
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
if (x) break;
эта ?
в стародавние времена когда создавался язык Си не было типа bool
и решили что 0 это ложь а все что не ноль это истина
эта запись идентична вот этой
C++
1
if (x!=0) break;
Добавлено через 7 минут
если напишешь так

C++
1
2
3
4
5
int a=5;
 
int b,c;
b=a==0;
c=a!=0;
то получишь b 0 c 1
все дело в том что при преобразовании из типа bool в тип int true(истина) равна 1, а false(ложь) равна 0
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
21.04.2014, 00:33  [ТС] #15
Цитата Сообщение от ValeryS Посмотреть сообщение
все данные внутри компьютера хранятся в виде двоичных чисел
Это понятно. Буду стараться лучше составлять вопросы чтобы не возникало не недопонимая. Весь вопрос и заключался в том что
C++
1
if (x) break;
в данном случае если ноль мы получаем ложь.
C++
1
2
3
4
char str[]="0123456789";
    const int SIZE=10;
    int arr[SIZE]={0}, index=0;
    for (char *p=str; *p;++p){
а тут в случае нуля все прекрасно работает. Ответ я понял только сейчас. Туплю, мозг не варит. Что тут мы получаем не ноль, а код символа 0(48). А где цикл if получаем именно 0. Как у меня полается так тупить и отнимать время у людей сам не понимаю((

Добавлено через 1 минуту
И наверное стоит читать кроме технических книг(я не про программирование) и что нибудь художественное дожился вопрос не могу составить что бы меня поняли(

Добавлено через 3 минуты
Ну в смысле я имел ввиду нулевой элемент массива str. я подставлял в for 0, а не 48((
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2014, 00:33
Привет! Вот еще темы с ответами:

Преобразование строки в число? - C++
Написал функцию, которая введенную преобразует в число. Но при выводе пишет, что она хранит не введенное число, а 0. В чем я ошибся? ...

Преобразование строки в число - C++
Здравствуйте. Преобразовываю строку в число с помощью функции atoi(), но есть одна проблема: int number; ...

Преобразование строки в число - C++
какой аналог есть в c++ на strtoint inttostr?

Преобразование char16_t строки в число - C++
Ну очень тупой вопрос - как стандартными средствами C++ преобразовать char16_t строку в число? В strtol не лезет, в wcstol не лезет,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.04.2014, 00:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru