Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.04.2014, 21:15. Просмотров 1112. Ответов 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 и т.п.) будут работать в юникоде?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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++
задача : реализовать деление двух целых чисел, передаваемых функции в виде строк Всем добрый вечер. Прошу ваших советов и подсказок....

23
zss
Модератор
Эксперт С++
6537 / 6099 / 2009
Регистрация: 18.12.2011
Сообщений: 15,870
Завершенные тесты: 1
21.04.2014, 13:33 #16
Цитата Сообщение от ValeryS Посмотреть сообщение
но по моему всем элементам присвоится 0
Ноль присваивается по умолчанию. Но я не уверен, что это стандарт.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
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 элементов, а не только в первый
0
LVV
88 / 85 / 17
Регистрация: 15.02.2010
Сообщений: 343
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;
}
1
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
21.04.2014, 18:40  [ТС] #19
LVV, код не мой и засорен он я так понимаю по причине всунуть в этот код определенные темы)) Но вам спасибо огромное за советы по оптимизации я их обязательно учту. кстати возник такой вопрос если я в 1 и той же среде измерю время работы программ и та программа которая завершиться быстрее ее можно считать более оптимизированней? или этих данных не хватает?
0
LVV
88 / 85 / 17
Регистрация: 15.02.2010
Сообщений: 343
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 Посмотреть сообщение
та программа которая завершиться быстрее ее можно считать более оптимизированней? или этих данных не хватает?
Помоему, всё зависит от ситуации. Если более быстрая программа выдаёт менее точный результат, который не неприемлем для конкретных условий, то такую программу нельзя назвать более оптимизированной. А вообще-то чем быстрее - тем лучше
1
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
21.04.2014, 19:09  [ТС] #21
Цитата Сообщение от LVV Посмотреть сообщение
А вообще-то чем быстрее - тем лучше
Не я не много не про то. Просто может эта программа выполняться быстрее не потому что она лучше, а потому что она сильнее нагрузила проц. Я имею ввиду режим отладки.
0
zss
Модератор
Эксперт С++
6537 / 6099 / 2009
Регистрация: 18.12.2011
Сообщений: 15,870
Завершенные тесты: 1
21.04.2014, 19:11 #22
Цитата Сообщение от ValeryS Посмотреть сообщение
я имел ввиду другое
C++
1
int a[10]={1};
запишет 1 во все 10 элементов, а не только в первый
Не запишет:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main()
{
    int a[5]={1};
    for(int i=0;i<5;i++)
         std::cout<<a[i]<<" ";
    std::cout<<std::endl;
    system ("pause");
    return 0;
}
1
Миниатюры
Преобразование строки в число  
LVV
88 / 85 / 17
Регистрация: 15.02.2010
Сообщений: 343
21.04.2014, 20:14 #23
int a[10]={1};
При одновременном обьявлении и инициализации массива, все неуказанные конечные элементы массива автоматически обнуляются.
Исключение: int a[]={1,5,7}; здесь будет создан массив по количеству указанных значений. (в данном случае размер массива - 3)
1
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
21.04.2014, 20:32 #24
Цитата Сообщение от zss Посмотреть сообщение
Не запишет:
действительно
Цитата Сообщение от LVV Посмотреть сообщение
При одновременном обьявлении и инициализации массива, все неуказанные конечные элементы массива автоматически обнуляются.
ну да все верно,это я чегой то перемудрил
но тогда (локальный массив)
C++
1
2
3
int main()
{
    int a[5]={0};
я обнуляю весь массив а не первый элемент
как писал zss
Цитата Сообщение от zss Посмотреть сообщение
нулевому элементу массива присваивается ноль.
и соответственно такая конструкция
Цитата Сообщение от zss Посмотреть сообщение
int arr[SIZE]={0,0,0,0,0,0,0,0,0,0};
лишняя
0
21.04.2014, 20:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2014, 20:32
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

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