2 / 2 / 1
Регистрация: 16.01.2012
Сообщений: 6
1

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

16.01.2012, 01:57. Показов 2574. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Эксперементирую с функциями в 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");
      
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2012, 01:57
Ответы с готовыми решениями:

Массив указателей на массив строк и сортировка массива указателей
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...

Массив из указателей на масив из указателей на массив из int)
Доброго времени суток! Возникла проблема - как на C++ создать массив из указателей на массив из...

11
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
16.01.2012, 02:07 2
Цитата Сообщение от HungryInsect Посмотреть сообщение
C++
1
char *s[4];
Это указатель на массив из четырёх элементов char. Под сам массив память не выделена.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.01.2012, 02:12 3
NoMasters, нет, это массив из 4-х указателей на чар.
2
NoMasters
16.01.2012, 02:14
  #4

Не по теме:

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

0
silent_1991
16.01.2012, 02:16
  #5

Не по теме:

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

0
2 / 2 / 1
Регистрация: 16.01.2012
Сообщений: 6
16.01.2012, 02:20  [ТС] 6
А в итоге совет-овет будет?

П.С. Увидев 4 ответа, я так обрадывался. (поспешил)
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
16.01.2012, 02:28 7
Ответ прежний: память под строки не выделена. Под все четыре, да
0
Заблокирован
16.01.2012, 03:50 8
Цитата Сообщение от HungryInsect Посмотреть сообщение
Вот собственно код рабочий. Но я хочу разобраться в этой теме, и сделать покороче, чтоли поизящнее, покрасивее.
Хэлп?
гармоничность относительна. Вполне приличная программа, единственно что можно заметить, так это то что тут
C
1
sum += atoi(s[i]);
может просто не хватить числа для вмещения суммы. Функцию atoi для таких мелких задач можно и свою написать, если она вообще нужна, потому что сумма 4 чисел в 9 разрядов более вероятно что не влезет чем влезет в инт. В остальном все в порядке.
0
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
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++ нет.
0
Заблокирован
16.01.2012, 05:16 10
Цитата Сообщение от JohnyWalker Посмотреть сообщение
Единственное, если не нравится это
всё у ТС в этом куске корректно. Нету прямой необходимости локать память из кучи.
0
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
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 и мой с использованием кучи).
0
Заблокирован
16.01.2012, 06:25 12
JohnyWalker, расписал, ну да ладно. Собственно мои сабжи касательны только этого предложения
Цитата Сообщение от HungryInsect Посмотреть сообщение
Но я хочу разобраться в этой теме, и сделать покороче, чтоли поизящнее, покрасивее. Хэлп?
И, если угодно, моя оценка ситуации. Программа хорошая, менять ничего не надо, предусмотреть переполнение целого числа. Все что выше - не интересует (лишнее место в памяти ).
Цитата Сообщение от JohnyWalker Посмотреть сообщение
Есть такая необходимость. Представьте, что число строк фиксировано, но велико.
Представить мы можем и жабу вместо носа, а по факту имеем совсем ничего - 40 ascii + 20 байт данных не считая ключевых слов syscall's. Потому и говорю что локать память прямой необходимости нету. Ну да ладно, написали что к чему, пусть переваривает.
0
16.01.2012, 06:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2012, 06:25
Помогаю со студенческими работами здесь

Массив из n символьных строк
Здравствуйте, Уважаемые форумчане :) Есть такое вот задание: Задан массив из n символьных...

Задача на массив символьных строк.
Возможно я не первый кто просит помочь в данной задачи, но все же повторюсь.: Дан текст, состоящий...

Запись указателей в массив указателей
Ребята, подскажите, пожалуйста, что не так сделано? Задача: без использования библиотек распарсить...

Чем отличаются двумерный символьный массив и массив указателей на строки
Двумерный символьный массив и массив указателей на строки. Собственно чем они отличаются? Заранее...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru