powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Непонятки с массивом
25 сообщений из 42, страница 1 из 2
Непонятки с массивом
    #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
Непонятки с массивом
    #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
Непонятки с массивом
    #38894114
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigorMortisОткуда всё это берётся в массиве у которого 6 элементов?
Из ошибки в функции, которой ты выводишь этот массив на экран.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятки с массивом
    #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
Непонятки с массивом
    #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
Непонятки с массивом
    #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
Непонятки с массивом
    #38894122
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigorMortisКартежник, тогда уж надо добавить result[length] = 0;

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

На, читай букварь:
https://en.wikipedia.org/wiki/Null-terminated_string
И пока не прочитаешь, ничего сюда не пиши. Хватит уже позориться.
...
Рейтинг: 0 / 0
Непонятки с массивом
    #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
Непонятки с массивом
    #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
Непонятки с массивом
    #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
Непонятки с массивом
    #38894496
rigorMortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я понял уже. Взял код от SashaMercury.
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38894498
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigorMortisДа я понял уже. Взял код от SashaMercury.

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

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

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


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

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

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


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

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

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


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

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

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

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


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