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

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

Восстановить пароль Регистрация
 
 
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
20.04.2014, 21:15     Преобразование строки в число #1
Вот код из учебника
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 и т.п.) будут работать в юникоде?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 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
Сообщений: 199
20.04.2014, 21:47  [ТС]     Преобразование строки в число #3
zss,
Цитата Сообщение от zss Посмотреть сообщение
нулевому элементу массива присваивается ноль
а почему в фигурных скобках? а про функции они в юникоде работать будут вы не в курсе?
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
20.04.2014, 22:07     Преобразование строки в число #4
Для уникода есть функции с суффиксом w
для atol:
_UNICODE defined
_wtol
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
20.04.2014, 22:10  [ТС]     Преобразование строки в число #5
zss, ну то что все кроме нуля дают истину я знаю. Но здесь нулевой элемент массива это число 0. Почему проверка тут не дает ложь? или цикл for выполняется хотя бы 1 раз? И как программа отличает что это знак конца записи, а не просто число 0?
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 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
Сообщений: 199
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
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
20.04.2014, 22:41     Преобразование строки в число #8
Этот нуль - это буква '0', а на 11 позиции стоит число ноль (или, если хотите, буква '\0').
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
20.04.2014, 22:58  [ТС]     Преобразование строки в число #9
zss, про инициализацию я запутался слишком привык к паскалю и делфи)) потом разберусь. если что уточню. Ладно чем отличается ноль от знака конца строки я понял, но осталась все равно не понятна маленькая деталь. Я понимаю, что за долбал вас глупыми вопросами, но кое что еще не понятно. Вот пример
C++
1
if (x) break;
в этом примере если х=0 это ложь, во всех остальных случаях истина.
Цитата Сообщение от zss Посмотреть сообщение
*p значение символа по текущему адресу
т.е *p==0 почему дает истинну а не ложь?
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
20.04.2014, 23:03     Преобразование строки в число #10
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
т.е *p==0 почему дает истинну а не ложь?
нук переведи
по адресу на который указывает указатель лежит 0
0==0 это истина
а если бы лежал не 0 то была бы ложь

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
нулевому элементу массива присваивается ноль.
не могу утверждать, но по моему всем элементам присвоится 0
по крайней мере я так загонял в массивы, элементов так в 100, значения
правда массивы были глобальные
проверить сейчас не могу
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
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
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
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
Сообщений: 199
20.04.2014, 23:36  [ТС]     Преобразование строки в число #13
Цитата Сообщение от ValeryS Посмотреть сообщение
это кто писал
я для предыдущего отвечающего так не удачно старался объяснить что я от него хочу. Т.е. код элемента в типе char храниться в 16-ной системе, если я вас правильно понял.
C++
1
if (x) break;
А почему такая запись "прокатывает"
Цитата Сообщение от ValeryS Посмотреть сообщение
(проходе) цикла(а не функции)
Да мозг уже не варит, из-за это циклы и функции смешались))

Добавлено через 1 минуту
x типа integer
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
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
Сообщений: 199
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((
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
21.04.2014, 13:33     Преобразование строки в число #16
Цитата Сообщение от ValeryS Посмотреть сообщение
но по моему всем элементам присвоится 0
Ноль присваивается по умолчанию. Но я не уверен, что это стандарт.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
21.04.2014, 17:56     Преобразование строки в число #17
Цитата Сообщение от zss Посмотреть сообщение
Но я не уверен, что это стандарт.
по моему для глобальных(статических) переменных обнуление гарантировано по стандарту
3.6.2 Initialization of non-local objects [basic.start.init]
Objects with static storage duration (3.7.1) shall be zero-initialized (8.5) before any other initialization takes place. A
reference with static storage duration and an object of POD type with static storage duration can be initialized with a
constant expression (5.19); this is called constant initialization. Together, zero-initialization and constant initialization
are called static initialization; all other initialization is dynamic initialization. Static initialization shall be performed
before any dynamic initialization takes place. Dynamic initialization of an object is either ordered or unordered. Def-
initions of explicitly specialized class template static data members have ordered initialization. Other class template
static data members (i.e., implicitly or explicitly instantiated specializations) have unordered initialization. Other ob-
jects defined in namespace scope have ordered initialization. Objects defined within a single translation unit and with
ordered initialization shall be initialized in the order of their definitions in the translation unit. The order of initialization
is unspecified for objects with unordered initialization and for objects defined in different translation units. [Note: 8.5.1
describes the order in which aggregate members are initialized. The initialization of local static objects is described in
6.7. —end note ]
я имел ввиду другое

C++
1
int a[10]={1};
запишет 1 во все 10 элементов, а не только в первый
LVV
56 / 56 / 3
Регистрация: 15.02.2010
Сообщений: 239
21.04.2014, 18:34     Преобразование строки в число #18
Ну, во-первых это не перевод строки в число, а перевод символьного массива в числовой.
А во-вторых, по-моему этот код чрезвычайно засорён. Всё можно сделать гораздо короче и понятнее.
Например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main(){
    char str[]="0123456789"; //определяется целочисленный (по умолчанию signed-знаковый) массив (от -128 до 127), он же символьный с непечатаемым символом окончания строки '\0'   
    const int SIZE=10;//определяется целочисленная константа
    int arr[SIZE]={};//определяется и обнуляется массив arr.(все десять элементов равны 0)
        
   for (int i=0; str[i]!='\0'; i++)
                   arr[i]=str[i]-48;
        
  for (int i=0;i<SIZE;i++)
        cout<<arr[i]<<endl;
  
 system("pause");
    return 0;
}
А лучше так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main(){
    char str[]="012456789";    
    int arr[sizeof(str)];
    
        
  for (int i=0; i<sizeof(str)-1; i++)
  {
                   arr[i]=str[i]-'0';
                   cout << arr[i];
  } 
  
 system("pause");
    return 0;
}
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 18:40  [ТС]     Преобразование строки в число #19
LVV, код не мой и засорен он я так понимаю по причине всунуть в этот код определенные темы)) Но вам спасибо огромное за советы по оптимизации я их обязательно учту. кстати возник такой вопрос если я в 1 и той же среде измерю время работы программ и та программа которая завершиться быстрее ее можно считать более оптимизированней? или этих данных не хватает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2014, 18:54     Преобразование строки в число
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
LVV
56 / 56 / 3
Регистрация: 15.02.2010
Сообщений: 239
21.04.2014, 18:54     Преобразование строки в число #20
Ну, а если действительно строку нужно превратить в число (в десятичном представлении), тогда так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <cmath>
using namespace std;
int main(){
    char str[]="0123456789";    
    int len=sizeof(str)-1;
    long long s=0;
        
  for (int i=len-1; i>=0; i--)
              s+=(str[i]-'0')*pow(10.0,len-i-1);
cout << s << endl;   
 system("pause");
    return 0;
}
Добавлено через 9 минут
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
та программа которая завершиться быстрее ее можно считать более оптимизированней? или этих данных не хватает?
Помоему, всё зависит от ситуации. Если более быстрая программа выдаёт менее точный результат, который не неприемлем для конкретных условий, то такую программу нельзя назвать более оптимизированной. А вообще-то чем быстрее - тем лучше
Yandex
Объявления
21.04.2014, 18:54     Преобразование строки в число
Ответ Создать тему
Опции темы

Текущее время: 23:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru