Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Непонятки с массивом / 25 сообщений из 42, страница 1 из 2
03.03.2015, 21:57
    #38894097
rigorMortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
привет
Кто-нибудь может объяснить почему эта функция

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* StrHelper::ToLower(char *str)
{
	char *result = new char[6];
	char str1[] = "DSFGDF";

	for (int i = 0; i < 6; i++)
		result[i] = str1[i];

	return result;
}



возвращает result=DSFGDFээээ««««««««оюоюою ??? Откуда всё это берётся в массиве у которого 6 элементов? (на остальное не обращаем внимания, это тест)
...
Рейтинг: 0 / 0
03.03.2015, 22:06
    #38894102
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
а если так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* StrHelper::ToLower(char *str)
{
	char *result = new char[7];
	char str1[] = "DSFGDF";

	for (int i = 0; i < 6; i++)
		result[i] = str1[i];
        result[6]=0; 
	return result;
}
...
Рейтинг: 0 / 0
03.03.2015, 22:28
    #38894114
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
rigorMortisОткуда всё это берётся в массиве у которого 6 элементов?
Из ошибки в функции, которой ты выводишь этот массив на экран.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.03.2015, 22:34
    #38894116
rigorMortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
Да, так никакого мусора нет (странно как-то всё). Только вот проблема если вместо char str1[] = "DSFGDF"; брать строку которая передаётся в функцию то ошибка при выполнении "нарушение прав доступа при записи по адресу":

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* StrHelper::ToUpper(char *str)
{
	int length = strnlen_s(str, 100);
	char *result = new char[7];

	for (int i = 0; i < length; i++)
		str[i] = toupper(str[i]); //нарушение прав доступа при записи по адресу ....

	return result;
}



Какие ещё права нужны?
...
Рейтинг: 0 / 0
03.03.2015, 22:40
    #38894119
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
rigorMortis,

а если так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* StrHelper::ToUpper(char *str)
{
	int length = strnlen_s(str, 100);
	char *result = new char[length];

	for (int i = 0; i < length; i++)
		result[i] = toupper(str[i]); //нарушение прав доступа при записи по адресу ....

	return result;
}
...
Рейтинг: 0 / 0
03.03.2015, 22:49
    #38894120
rigorMortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
Картежник, тогда уж надо добавить result[length] = 0;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
char* StrHelper::ToUpper(char *str)
{
	int length = strnlen_s(str, 100);
	char *result = new char[length];

	for (int i = 0; i < length; i++)
		result[i] = toupper(str[i]);

	result[length] = 0;

	return result;
}


Спасибо, помогло.
Блин, сложно как всё стало. Последний раз кодил на с++ больше 10 лет назад. Ща сел простенькую прогу написать, элементарных вещей сделать не могу.
...
Рейтинг: 0 / 0
03.03.2015, 22:54
    #38894122
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
rigorMortisКартежник, тогда уж надо добавить result[length] = 0;

тогда надо сделать
Код: plaintext
1.
char *result = new char[length+1];
...
Рейтинг: 0 / 0
03.03.2015, 23:01
    #38894123
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
rigorMortisint length = strnlen_s(str,100);
А нафига ты массив объявляешь размером 6, а тут говоришь, что он 100? Врать нехорошо, за
это тебя и карает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.03.2015, 23:07
    #38894124
rigorMortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
Dimitry Sibiryakov, int length = strnlen_s(str, 100); определяет длину строки. Что мне нужно было подставить вместо 100? Если бы я знал длину я бы не вызывал strnlen_s.
...
Рейтинг: 0 / 0
03.03.2015, 23:21
    #38894125
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
rigorMortisЕсли бы я знал длину я бы не вызывал strnlen_s.
Ты знаешь длину. Ты её вот здесь указал: new char[6]
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.03.2015, 23:55
    #38894133
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
rigorMortisвозвращает result=DSFGDFээээ««««««««оюоюою ??? Откуда всё это берётся в массиве у которого 6 элементов? (на остальное не обращаем внимания, это тест)
Привет. А ты чего передаёшь массив символов в функцию, которая ожидает null terminated string? Ты думаешь, как strnlen_s длину строки высчитывает?
...
Рейтинг: 0 / 0
04.03.2015, 01:54
    #38894152
rigorMortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
BagaBaga, ну я не знаю. А как предавать тогда?
...
Рейтинг: 0 / 0
04.03.2015, 01:59
    #38894153
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
rigorMortis,

На, читай букварь:
https://en.wikipedia.org/wiki/Null-terminated_string
И пока не прочитаешь, ничего сюда не пиши. Хватит уже позориться.
...
Рейтинг: 0 / 0
04.03.2015, 02:18
    #38894154
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
rigorMortisпривет
Кто-нибудь может объяснить почему эта функция

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* StrHelper::ToLower(char *str)
{
	char *result = new char[6];
	char str1[] = "DSFGDF";

	for (int i = 0; i < 6; i++)
		result[i] = str1[i];

	return result;
}



возвращает result=DSFGDFээээ««««««««оюоюою ??? Откуда всё это берётся в массиве у которого 6 элементов? (на остальное не обращаем внимания, это тест)

Эта функция никак не может возвращать то, что вы написали. Она возвращает указатель. Когда вы пытаетесь вывести на поток вывода строку расположенную по этому указателю, происходит "чтение" до тех пор, пока не встретится терминальный ноль '\0'. Как вы понимаете, он у вас не встретится за эти 6 символов. При проектировании строки, всегда оставляйте 1 символ под терминальный ноль.

По второму вопросу, в первом приближении код должен быть такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
void str_to_low_in_place(char* dest, const char* val, size_t size)
{
	int i = 0;
	while (i<size){ 
		dest[i++] = toupper(val[i]);
	}
}

char* str_to_low(const char* val)
{
	size_t size = strlen(val) + 1;
	char* dest = (char*)malloc(sizeof(char)*size);
	str_to_low_in_place(dest, val, size);
	return dest;
}
...
Рейтинг: 0 / 0
04.03.2015, 08:19
    #38894218
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
rigorMortisBagaBaga, ну я не знаю. А как предавать тогда?

Как думаешь, какое число вернёт этот код?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#include <iostream>
using namespace std;

int main() {
	char str1[] = "DSFGDF";
	cout << "The size is " << sizeof(str1);
	return 0;
}


Поймёшь что и почему - вопросы исчезнут сами собой.
...
Рейтинг: 0 / 0
04.03.2015, 12:10
    #38894432
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
BagaBagarigorMortisBagaBaga, ну я не знаю. А как предавать тогда?

Как думаешь, какое число вернёт этот код?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#include <iostream>
using namespace std;

int main() {
	char str1[] = "DSFGDF";
	cout << "The size is " << sizeof(str1);
	return 0;
}


Поймёшь что и почему - вопросы исчезнут сами собой.

rigorMortis, выше -- очень толковый совет.
...
Рейтинг: 0 / 0
04.03.2015, 12:56
    #38894496
rigorMortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
Да я понял уже. Взял код от SashaMercury.
...
Рейтинг: 0 / 0
04.03.2015, 12:59
    #38894498
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
rigorMortisДа я понял уже. Взял код от SashaMercury.

Но учти, это не для продакшн кода, будет работать в одной только кодировке -- ANSI (ASCII и её расширениях).
...
Рейтинг: 0 / 0
04.03.2015, 15:48
    #38894755
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
MasterZivrigorMortisДа я понял уже. Взял код от SashaMercury.

Но учти, это не для продакшн кода, будет работать в одной только кодировке -- ANSI (ASCII и её расширениях).

а как бы выглядел "продакшн" код ?
...
Рейтинг: 0 / 0
04.03.2015, 15:53
    #38894761
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
SashaMercuryMasterZivпропущено...


Но учти, это не для продакшн кода, будет работать в одной только кодировке -- ANSI (ASCII и её расширениях).

а как бы выглядел "продакшн" код ?

в принципе это невозможно так сделать, изменить case в том же буфере -- длины символом (в байтах) могут быть разные,
т.е. результат может не влезть в исходный буфер.
...
Рейтинг: 0 / 0
04.03.2015, 15:56
    #38894766
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
то есть в других кодировках объём памяти на разные регистры одной и той-же буквы могут отличаться ?
...
Рейтинг: 0 / 0
04.03.2015, 16:04
    #38894780
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
SashaMercuryто есть в других кодировках объём памяти на разные регистры одной и той-же буквы могут отличаться ?
Конечно.
Не для всех кодировок, естественно.
Но приложение с поддержкой разных должно быть на это завязано, безусловно.
...
Рейтинг: 0 / 0
04.03.2015, 18:59
    #38895038
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
SashaMercuryMasterZivпропущено...


Но учти, это не для продакшн кода, будет работать в одной только кодировке -- ANSI (ASCII и её расширениях).

а как бы выглядел "продакшн" код ?

Форумчане, ну не надо троллить... смешивать многобайтовые кодировки и классические С-строки (NULL-terminated string) - изыскание приключений на причинное место. Тогда уж не забудьте, что даже в ASCII toUpper будет худо-бедно работать на первых 127 символах (т.е. латинском алфавите), а вот на "расширенных" (в коих и хранятся "национальные" кодировки) - далеко не факт и сильно зависит от настроек локали...
...
Рейтинг: 0 / 0
04.03.2015, 20:48
    #38895128
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
BagaBagaSashaMercuryпропущено...


а как бы выглядел "продакшн" код ?

Форумчане, ну не надо троллить... смешивать многобайтовые кодировки и классические С-строки (NULL-terminated string) - изыскание приключений на причинное место. Тогда уж не забудьте, что даже в ASCII toUpper будет худо-бедно работать на первых 127 символах (т.е. латинском алфавите), а вот на "расширенных" (в коих и хранятся "национальные" кодировки) - далеко не факт и сильно зависит от настроек локали...

ну, в нормально сделанных CRT будет работать...

но вообще то уже давно пора забрать про однобайтные кодировки.
...
Рейтинг: 0 / 0
04.03.2015, 20:51
    #38895130
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с массивом
MasterZivно вообще то уже давно пора забрать про однобайтные кодировки.
Далеко не все пишут всемирно используемый ширпотреб. А два байта больше одного ровно в два раза.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Непонятки с массивом / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]