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

Массив символьных указателей - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
HungryInsect
2 / 2 / 1
Регистрация: 16.01.2012
Сообщений: 6
16.01.2012, 01:57     Массив символьных указателей #1
Эксперементирую с функциями в stdlib. В данной программе конкретно atoi();
Но не в этом суть.
Проблема вот в чем. Я использую в этой программе массив строчных указателей. И я хочу его инициализировать вводя значения с клавиатуры. Я пробывал сначала вот так вот

C++
1
2
3
4
5
6
char str[10];
char *s[4];
 
for(int i = 0; i <= 3; i++){
    cin >> str;
    s[i] = str;
В итоге все укзатели в массиве равнялись последнему вводимому значению. А первый указатель вообще никак значение не отображал (Тоже вопрос). И до меня дошло, что указателям присваивается адресс массива str. А после собственно по адрессу передают одинаковое значение.

А вообще с самого начала, у меня была идея считывать сразу в указатели.
C++
1
2
3
4
char *s[4];
 
for(int i = 0; i <= 3; i++){
    cin >> s[i];
Ведь вот так можно:

C++
1
char *s[4]={"Green","Blue","Black","Yellow"};
Вот собственно код рабочий. Но я хочу разобраться в этой теме, и сделать покороче, чтоли поизящнее, покрасивее.
Хэлп?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <stdlib.h>
 
using namespace std;
 
main()
{
      cout << "Enter 4 strings which contain integer digits \n";
      char *s[4];
      char str1[10], str2[10], str3[10], str4[10];
      
      cin >> str1 >> str2 >> str3 >> str4;
      s[0] = str1;
      s[1] = str2;
      s[2] = str3;
      s[3] = str4;
      
      cout << "The summ of the ";
      int sum = 0;
      
      
      for (int i = 0; i <= 3; i++){
          cout << s[i] << (i==3 ? " = " : " + ");
          sum += atoi(s[i]);
          }
          
          
      cout << sum;
      cout << "\nThe strings are: \n";
      
      
      for (int i = 0; i <= 3; i++)
          cout << (i+1) << ". " << s[i] << '\n';
          
      
      system("PAUSE");
      
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,094
16.01.2012, 02:07     Массив символьных указателей #2
Цитата Сообщение от HungryInsect Посмотреть сообщение
C++
1
char *s[4];
Это указатель на массив из четырёх элементов char. Под сам массив память не выделена.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.01.2012, 02:12     Массив символьных указателей #3
NoMasters, нет, это массив из 4-х указателей на чар.
NoMasters
16.01.2012, 02:14
  #4

Не по теме:

Каюсь, время позднее, тупяк медленно подкрадывается

silent_1991
16.01.2012, 02:16
  #5

Не по теме:

NoMasters, так и подумал

HungryInsect
2 / 2 / 1
Регистрация: 16.01.2012
Сообщений: 6
16.01.2012, 02:20  [ТС]     Массив символьных указателей #6
А в итоге совет-овет будет?

П.С. Увидев 4 ответа, я так обрадывался. (поспешил)
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,094
16.01.2012, 02:28     Массив символьных указателей #7
Ответ прежний: память под строки не выделена. Под все четыре, да
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.01.2012, 03:50     Массив символьных указателей #8
Цитата Сообщение от HungryInsect Посмотреть сообщение
Вот собственно код рабочий. Но я хочу разобраться в этой теме, и сделать покороче, чтоли поизящнее, покрасивее.
Хэлп?
гармоничность относительна. Вполне приличная программа, единственно что можно заметить, так это то что тут
C
1
sum += atoi(s[i]);
может просто не хватить числа для вмещения суммы. Функцию atoi для таких мелких задач можно и свою написать, если она вообще нужна, потому что сумма 4 чисел в 9 разрядов более вероятно что не влезет чем влезет в инт. В остальном все в порядке.
JohnyWalker
163 / 42 / 1
Регистрация: 15.11.2010
Сообщений: 332
16.01.2012, 05:04     Массив символьных указателей #9
Ха, а задачка решена не без изящества.
Понравилась вот эта конструкция
C++
1
cout << s[i] << (i==3 ? " = " : " + ");
Не сразу понятно, что она означает, зато, когда разберешься, выглядит красиво.

Единственное, если не нравится это

C++
1
2
3
4
5
6
7
char str1[10], str2[10], str3[10], str4[10];
 
cin >> str1 >> str2 >> str3 >> str4;
s[0] = str1;
s[1] = str2;
s[2] = str3;
s[3] = str4;
вы ведь явно хотели сделать ввод в цикле, то можно сделать так

C++
1
2
3
for(int i=0; i<4; i++)
{s[i]=new char[10];
 cin >> s[i];}
Достаточно заменить первый кусок на второй и программа должна заработать, дав тот же результат.
Естественно, что массивы str1, str2, str3, str4 и соответствующая строка, определяющая их, больше не нужны. Попробуйте сделать это и скомпилировать программу, я точно не уверен, под рукой компилятора C/C++ нет.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.01.2012, 05:16     Массив символьных указателей #10
Цитата Сообщение от JohnyWalker Посмотреть сообщение
Единственное, если не нравится это
всё у ТС в этом куске корректно. Нету прямой необходимости локать память из кучи.
JohnyWalker
163 / 42 / 1
Регистрация: 15.11.2010
Сообщений: 332
16.01.2012, 06:11     Массив символьных указателей #11
Цитата Сообщение от alkagolik Посмотреть сообщение
всё у ТС в этом куске корректно. Нету прямой необходимости локать память из кучи.
Есть такая необходимость. Представьте, что число строк фиксировано, но велико. Что, для каждой создавать в программе (в исходном тексте) отдельную переменную, со своим именем? Другой вариант, когда количество строк само по себе величина переменная, тогда как прикажете быть?

А главное посмотрите, с чего ТС начал свой вопрос.
Он привел пример исходника с ошибкой, вот он
C++
1
2
3
4
5
6
7
 
char str[10];
char *s[4];
 
for(int i = 0; i <= 3; i++){
    cin >> str;
    s[i] = str;}
и вот
А вообще с самого начала, у меня была идея считывать сразу в указатели.
Код C++
C++
1
2
3
4
char *s[4];
 
for(int i = 0; i <= 3; i++)
     cin >> s[i];
Последнее - это цель, как ему хотелось это все реализовать.
Я ему лишь помог решить его задачу. Если бы у ТС такой задачи не стояло, он бы и не стал задавать вопрос на форуме.

Так что уважаемый alkogolik Вы, отвечая на вопрос, все-таки исходите не из своего видения программирования, а из того, чего хотел добиться задававший вопрос человек и в чем он испытал трудность. А так, конечно, в такой несложной задаче оба варианта приемлемы, оба решают задачу, я и не спорю.

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

Вместо char *s[4]; (массив указателей)
объявить s как двумерный массив (массив массивов)
char s[4][10];

И тогда кусок исходного текста, как его хотел видеть ТС
for(int i = 0; i <= 3; i++)
cin >> s[i];
заработает вполне корректно.

А именно
C++
1
2
char s[4][10];
for(int i=0; i<4; i++)   cin >> s[i];
Тоже вполне пригодный вариант, только обязательно проверьте его компилятором.

Если же объявлять s как
char *s[4];
то так нельзя, подойдут два предыдущих варианта (вариант ТС с объявленными строками str1,... str4 и мой с использованием кучи).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2012, 06:25     Массив символьных указателей
Еще ссылки по теме:

опп класс и массив (создать массив указателей по выборке животных, участвующих в забеге) C++
Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей C++
Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей C++

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

Или воспользуйтесь поиском по форуму:
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.01.2012, 06:25     Массив символьных указателей #12
JohnyWalker, расписал, ну да ладно. Собственно мои сабжи касательны только этого предложения
Цитата Сообщение от HungryInsect Посмотреть сообщение
Но я хочу разобраться в этой теме, и сделать покороче, чтоли поизящнее, покрасивее. Хэлп?
И, если угодно, моя оценка ситуации. Программа хорошая, менять ничего не надо, предусмотреть переполнение целого числа. Все что выше - не интересует (лишнее место в памяти ).
Цитата Сообщение от JohnyWalker Посмотреть сообщение
Есть такая необходимость. Представьте, что число строк фиксировано, но велико.
Представить мы можем и жабу вместо носа, а по факту имеем совсем ничего - 40 ascii + 20 байт данных не считая ключевых слов syscall's. Потому и говорю что локать память прямой необходимости нету. Ну да ладно, написали что к чему, пусть переваривает.
Yandex
Объявления
16.01.2012, 06:25     Массив символьных указателей
Ответ Создать тему
Опции темы

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