Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2013, 12:33   #1
Мария1992
Пользователь
 
Регистрация: 17.05.2013
Сообщений: 20
Восклицание Есть вопрос по задаче, СРОЧНО!!!

В конструкторе, который принимает укатель на char, не проставляется терминирующий ноль. Во втором конструкторе, терминирующий ноль проставляется в неправильное место (должен проставляться в n-й символ).
Скажите как это исправить?ОЧЕНЬ НУЖНО!!!Пожалуйста помогите!!
Код:
#include <cstdlib>
#include <iostream>

using namespace std;

class String
{
private:
	char* str;
	int n; 
public:
	String(char* string = "")
	{
		n = strlen(string) + 1;
		str = new char[n];
		memcpy(str, string, n);
	}

	String(char* string, size_t size)  //êîíñòðóêòîð, 
ïîçâîëÿþùèé ñîçäàòü 
ñòðîêó èç size ñèìâîëîâ

	{
		n = size + 1;
		str = new char[n];		
		memcpy(str, string, n * sizeof(char));
		str[size] = 0;
	}

	~String()
	{
		if (str)
		delete str;
	}

	void print()
	{
		std::cout << str << std::endl;
	}

	int const getnum() //êîë-âî ñèìâîëîâ â 
ñòðîêå
	{
		return n - 1;
	}

	char const getchar(int n) // ñèìâîë èç ïîçèöèè n
	{
		return str[n - 1];
	}

	void upper()  // â âåðõíèé ðåãèñòð
	{
		for (int i = 0; i < n; i++)
			str[i] = toupper(str[i]);
	}

	int const punctuation() // êîë-âî çíàêîâ 
ïðåïèíàíèÿ
	{
 int count = 0;
 for (int i = 0; i < n; i++)
 if (ispunct(str[i]))
    count++;
    return count;
	}
};

int main()
{ 
char s[255];
std::cin.getline(s, 255);
String str(s);
	
	str.upper();
	str.print();

	std::cout << str.getnum() << std::endl;
	std::cout << str.punctuation() << std::endl;
	std::cout << str.getchar(1) << std::endl;

	system("PAUSE");
	return 0;
}

Последний раз редактировалось Stilet; 28.11.2013 в 14:52.
Мария1992 вне форума Ответить с цитированием
Старый 28.11.2013, 14:58   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Решил не спрашивать почему так.
Считаю что сделал бы следующее:
Код:
	String(char* string = "")
	{
		n = strlen(string);
		str = new char[n+1];
		memcpy(str, string, n);
                str[n] = 0;
	}

	String(char* string, size_t size)  

	{
		str = new char[size+1];		
		memcpy(str, string, size);
		str[size] = 0;
	}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.11.2013, 18:55   #3
Мария1992
Пользователь
 
Регистрация: 17.05.2013
Сообщений: 20
По умолчанию Исправьте пожалуйста недочеты

Добавлено через 6 минут
Свойство getchar на данный момент позволяет только вернуть символ (то есть чтение), но никак не записать его. Для того, чтобы можно было записывать в тот символ, который мы вернули, символ нужно возвращать не по значению, а по ссылке. После этого в главной программе можно будет написать следующую строчку кода (и она будет работать):
Код:
str.getchar(1) = 'R';

Исправте это, пожалуйста, очень прошу

Программа после изменений выглядит так:
Код:
#include <cstdlib>
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
class String
{
private:
    char* str;
    int n; 
public:
    String(char* string = "")
    {
        n = strlen(string);
        str = new char[n + 1];
        strcpy(str, string);
    }
 
    String(char* string, size_t size)  //конструктор, позволяющий создать строку из size символов
    {
        n = size;
        str = new char[n + 1];      
        strncpy(str, string, n);
        if (strlen(string) > size)
             str[n] = '\0';
    }
 
    ~String()
    {
        if (str)
        delete [] str;
    }
 
    void print()
    {
        std::cout << str << std::endl;
    }
 
    int const getnum() //кол-во символов в строке
    {
        return n;
    }
 
    const char  getchar(int n) // символ из позиции n
    {
          
        return str[n - 1];
        
    }
 
    void upper()  // в верхний регистр
    {
        for (int i = 0; i < n; i++)
            str[i] = toupper((unsigned char)str[i]);
    }
 
    const int  punctuation() // кол-во знаков препинания
    {
        int count = 0;
        for (int i = 0; i < n; i++)
        if (ispunct((unsigned char)str[i]))
            count++;
        return count;
    }
};
 
int main()
{ 
    
    setlocale(0, "");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    char s[255];
    std::cin.getline(s, 255);
    String str(s);
    
    str.upper();
    str.print();
    
 
    std::cout << str.getnum() << std::endl;
    std::cout << str.punctuation() << std::endl;
    std::cout << str.getchar(1) << std::endl;
 
    system("PAUSE");
    return 0;
}
Мария1992 вне форума Ответить с цитированием
Старый 28.11.2013, 19:47   #4
troyan90
Пользователь
 
Регистрация: 23.06.2011
Сообщений: 54
По умолчанию

это
Код:
const char  getchar(int n) // символ из позиции n
{          
        return str[n - 1];  
}
замените на это
Код:
char& getchar(int n)
{
	return str[n - 1];
}
troyan90 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Delphi] Помогите выявить ошибки в задаче! Пожалуйста! Очень срочно! OtimJ Помощь студентам 3 23.12.2008 13:23
составте пожалуйста блок-схему к задаче нужно срочно павел12 Помощь студентам 1 21.12.2008 04:35
Найдите, пожалуйта,ошибки в задаче!очень срочно! Wia Помощь студентам 2 06.12.2008 20:02
Пожалуйста срочно помочь мне исправить ошибку в задаче Vladislav_87 Паскаль, Turbo Pascal, PascalABC.NET 8 20.05.2008 20:46