LINUX.ORG.RU

Каким образом здесь сделать строку?

 ,


0

1

Да, это тот самый нуб с кривым кодом, всем привет. Очередная проблема: создал динамическую структуру, но не могу через нее выразить строку, вылезает ошибка expected primary-expression before '{' token.

#include <iostream>
#include <string>

struct donators
{
         const char *name[100]; // Всякие там объявления
         int sum;
};

int main()
{
    const char *entry[10] = {"Ander", "Muckler", "Guy", "Stand", "Man"}; // Обычная строчка
    using namespace std;
    donators *pt = new donators; // Объявил динамическую структуру
    pt->name[0] = {"Ander", "Muckler", "Guy", "Stand", "Man"}; // Строка с указателем
                                                                                                              
    delete pt;
    cin.get();
    return 0;
}

Если я где-то неправильно оперирую терминами, ошибаюсь или вообще программирую через задницу, то пишите, мне полезно будет. String у меня инициализируются по одной, по нескольку просто вышибает ошибку. P.S. На суть кода не смотрите, программа сделана от балды и для теста, ибо эта проблема меня достала.



Последнее исправление: Hubble (всего исправлений: 2)

1. Это не string. Почитай об std::string, тебе будет полезно.
2. «Обычная строчка» - это массив сишных строк.
3. Зачем тебе массив на 100 сишных строк?
4. В «строке с указателями» у тебя форменный бред. Ты присваиваешь строковой переменной целый массив строк.
5. C-строки не присваивают просто так, а копируют посредством strcpy.
6. using namespace std лучше не using. Почему - интернет знает.
7. Что ты пытаешься сделать вообще в этой программе?
8. Попробуй прочитать K&R, а после них - Страуструпа.

E ★★★
()
Ответ на: комментарий от E

Хм, не до конца кое-что понял. 1. Я имел в виду то, что по одному выражению в std::string я могу вставлять, но два и более элемента уже вызывают ошибку. 2. Понял. 3. Тестовая программа для проверки строк, в оригинале было что-то вроде «Есть список пожертвовавших деньги, добавьте N человек и через цикл перечислите их» 4. Тут поподробнее бы. 5. Тут тоже. 6. Знаю, но для такого нуба как я вполне нормально. 7. Писал выше. 8. Читаю Прату. Хочу сначала освоить C++, ибо в C даже на начальном уровне надо пилить сотни костылей, что немного неприятно.

Hubble
() автор топика
Ответ на: комментарий от Hubble
#include <iostream> // cin, cout
#include <vector> // vector
#include <string> // string
#include <cstddef> // size_t

using namespace std;

class Donator
{
	public:
		Donator( const string& name, size_t donation ):
			name_( name ), donation_( donation )
		{
		}

		string name() const
		{
			return name_;
		}

		size_t donation() const
		{
			return donation_;
		}

	private:
		string name_;
		size_t donation_;
};

int main()
{
	vector< Donator > donators;

	donators.emplace_back("Carl", 34);
	donators.emplace_back("Xavier", 43);
	donators.emplace_back("Harry", 33);
	donators.emplace_back("Steven", 56);

	for(const auto &donator : donators)
	{
		std::cout << donator.name()
					 << " donated "
					 << donator.donation()
					 << "$" << endl;
	}
	return 0;
}
anonymous
()
Ответ на: комментарий от anonymous

Спасибо вам, благородный дон, но до классов мне еще 3-4 главы переть :) А код довольно аккуратный.

Hubble
() автор топика
auto pt=new donators{{"Ander","Muckler","Guy","Stand","Man"},66};
anonymous
()
Ответ на: комментарий от Hubble

Без классов

#include <iostream> // cin, cout
#include <cstddef> // size_t

using namespace std;

struct Donator
{
		const char *name;
		size_t donation;
};

int main()
{
	Donator donators[] = { { "Carl",		34 },
								  { "Xavier",	43 },
								  { "Harry",	33 },
								  { "Steven",	56 } };

	for( size_t i = 0; i < 4; ++i )
	{
		cout << donators[i].name
				<< " donated "
				<< donators[i].donation
				<< endl;
	}

	return 0;
}

anonymous
()
Ответ на: комментарий от Hubble

Во-первых убери const — константа должна быть проинициализирована стразу, а не когда приспичит.
Во-вторых выдели память.
В-третьих скопируй в выделенную память нужную строку.
И вот только тут можно указателю присваивать адрес памяти со строкой.

Мне конкретно слова нужны.

Э-э-э-э не. Это совсем базовые вещи, поэтому ты должен написать эти слова самостоятельно. Иначе ничему не научишься.

Stahl ★★☆
()
Ответ на: комментарий от anonymous

Cпасибо большое, но мне скорее нужно узнать, как работать с множеством элементов в строке, а также со строками в динамических массивах/структурах.

Hubble
() автор топика
Ответ на: комментарий от Stahl

Память-то я вроде выделил, когда создал динамическую структуру. А как скопировать строку в память?

Hubble
() автор топика
Ответ на: комментарий от Hubble

Память-то я вроде выделил, когда создал динамическую структуру

У тебя в структуре выделена память на 100 указателей на char.
Для собственно строк ты память не выделял.

Stahl ★★☆
()
Ответ на: комментарий от Stahl

Вот оно что... Спасибо, думаю, это поможет.

Hubble
() автор топика
Ответ на: комментарий от Hubble

либо читай про malloc , либо пиши что-то вроде «char* ptr = new char[100];» Эта строка выделит память для 100 char и одного указателя на char и, соответственно, присвоит указателю адрес выделенной памяти.
Слушай, не занимайся фигнёй. Почитай книгу. Любой автор напишет правильней и доходчивей, чем х.з. кто с непрофильного форума.

Stahl ★★☆
()
Ответ на: комментарий от Stahl

Суть в том, что я читал книгу предельно внимательно, но там не было и слова про строки в динамических структурах. Если обычные строки я как-то худо-бедно могу сделать, то с такими изворотами у меня уже мало что выходит. Пропущу, наверно, эту задачу до того, как пойму суть этой операции.

Hubble
() автор топика

{"Ander", "Muckler", "Guy", "Stand", "Man"} это инициализатор, его надо использовать при создании объекта (как в const char *entry[10] = ..., при присвоении значений использовать не получится. Тут можно так (но остальные элементы сами не занулятся):

pt->name[0] = "Ander";
pt->name[1] = "Muckler";
pt->name[2] = "Guy";
pt->name[3] = "Stand";
pt->name[4] = "Man";

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Да, я так уже пробовал, но это как-то не слишком рационально, что ли. Как если бы мы каждую букву записывали в char, а потом составляли выражение.

Hubble
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.