powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Непонятки с массивом
42 сообщений из 42, показаны все 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
Непонятки с массивом
    #38895175
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
про однобайтовые кодировки ещё очень долго не удастся забыть - слишком много средств работает именно с ними. И далеко не все консоли используют их. В том же "самом популярном" до сих пор в консоли cp866 используется. Да и на что ориентироваться? UTF8? UTF16? USC? USC-2? KIO8R? Да и многие nix внутри всё ещё однобайтовые...
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38895316
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSashaMercuryто есть в других кодировках объём памяти на разные регистры одной и той-же буквы могут отличаться ?
Конечно.
Не для всех кодировок, естественно.
Но приложение с поддержкой разных должно быть на это завязано, безусловно.

Не знал этого. Спасибо :)
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38895319
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercuryпропущено...


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

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

да я и не "троллил" . В Сообществе такого в принципе нет.
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38895334
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryда я и не "троллил" . В Сообществе такого в принципе нет.
Не знал этого. Спасибо :)
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38895429
Alexklonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaДа и на что ориентироваться? UTF8? UTF16? USC? USC-2? KIO8R?
Лучше на UTF-8. Экономит место, поддерживается в консолях Linux, QNX и блокноте Windows 8.
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38895519
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryто есть в других кодировках объём памяти на разные регистры одной и той-же буквы могут отличаться ?
Вот почитайте, статейка старая, описано доходчиво для понимания.
BagaBaga.. Да и на что ориентироваться? UTF8? UTF16? USC? USC-2? KIO8R?
А почему бы Вам не предоставить возможность ответа на данный вопрос конечному пользователю Вашего приложения, а не ограничивать его чем-то одним?
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38896481
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М.BagaBaga.. Да и на что ориентироваться? UTF8? UTF16? USC? USC-2? KIO8R?
А почему бы Вам не предоставить возможность ответа на данный вопрос конечному пользователю Вашего приложения, а не ограничивать его чем-то одним?
Я всё же это удовольствие (рассчитывать на все кодировки в любом их сочетании) оставлю Вам. А сам буду исходит из здравого смысла, требований ТЗ и существуюх ограничений. Кои определяются:
1. Планируемой средой выполнения. Если целевая система не поддерживает кодировку, то какой смысл тратить на неё и так ограниченные ресурсы?
2. Используемой средой разработки. Если она не поддерживает выбранную кодировку ... в общем, нескучной отладки.
3. Используемым набором библиотек (фреймвоков). Если библиотеки не поддерживает какую-либо кодировку в принципе, то нужно выбросить либо библиотеку, либо забить на кодировку.
4. Унаследованным кодом, зачастую писавшимся ещё в то время, когда возможности многобайтных кодировок даже не помышляли. Выкинуть уже (пусть как-то) работающую систему из-за любви к искусству ни кто в своём уме не даст.
5. Малой практикой написания кросплатформенных "многокодировочных" приложений. Все успешные используют внутри какуют-то одну, а всё "ионое" перекодируют явным или прозрачным способом, если вообще заморачиваются на это.

Если интересно про поддержку кодировок в С++, можно посмотреть, например, вот это - http://goo.gl/dK9KUR
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38896488
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы исходил из возможностей интеграции.
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38896680
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaMasterZiv,
про однобайтовые кодировки ещё очень долго не удастся забыть - слишком много средств работает именно с ними. И далеко не все консоли используют их. В том же "самом популярном" до сих пор в консоли cp866 используется. Да и на что ориентироваться? UTF8? UTF16? USC? USC-2? KIO8R? Да и многие nix внутри всё ещё однобайтовые...

Ну не знаю...
Я работаю сейчас в основном под Linux, тут просто ВСЁ поддерживает ВСЕ кодировки.

А на счёт "что выбрать" -- тут уже тоже давно всё понятно -- UTF8. Войны кодировок кончились.
Но ещё раз -- в линуксе как правило все приложения поддерживают все кодировки. Т.е. какую хочешь -- такую и используй,
таким образом теперь только время решит, что лучше.
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38896803
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
с u8, наверное, согласен. Хотя ещё лет пять назад всё было не так однозначно. И для иероглифического письма всё-таки UTF (что 8, что не 8) не самое распространённое решение. У них свой велосипед (как минимум - у японцев). Но это, что называется, не моя целевая аудитория.

Про кодировки и прочее. У Вас нормально отработает
cat filename | sed 's/право/лево/' > newfile
если консоль u8 (или KOI8, или ещё какая), а файл, например, в старой доброй cp866 (или другой, не той, что в консоли)?
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38896805
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* в примере специально использована кирилица. С латиницей, понятное дело, всё должно быть ок.
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38897939
rigorMortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Но учти, это не для продакшн кода, будет работать в одной только кодировке -- ANSI (ASCII и её расширениях).

Тогда опять непонятно. Читаю из файла строку с русскими символами:

DIR c:\\лог

в char t[20]; записывается "DIR c:\\Лог". Если русских символов в ASCII нет почему выводится нормально?

Та же строка из файла, но в wchar_t t[20] записывается "DIR c:\\Ëîã". Из-за чего так?
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38897957
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лет 10 назад уже было все однозначно....

BagaBaga
Про кодировки и прочее. У Вас нормально отработает
cat filename | sed 's/право/лево/' > newfile
если консоль u8 (или KOI8, или ещё какая), а файл, например, в старой доброй cp866 (или другой, не той, что в консоли)?


нет, конечно, но

export LANG=xxxx

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

Тогда опять непонятно. Читаю из файла строку с русскими символами:

DIR c:\\лог

в char t[20]; записывается "DIR c:\\Лог". Если русских символов в ASCII нет почему выводится нормально?

Та же строка из файла, но в wchar_t t[20] записывается "DIR c:\\Ëîã". Из-за чего так?

а вот магия...

на самом деле скорее всего там занимаешься все верно, неправильно ты смотришь...
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38897964
rigorMortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
а вот магия...

на самом деле скорее всего там занимаешься все верно, неправильно ты смотришь...

Отладчик показывает.
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38898024
rigorMortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
		std::wifstream wif("c:\\file.txt", std::ios::binary);
		std::wstringstream wss;
		wss << wif.rdbuf();
		std::wstring str1 = wss.str(); 

		const wchar_t* s = str1.c_str();

		FILE* file = fopen("c:\\file1.txt", "w");
		fwprintf(file, s);
		fclose(file);



из файла file.txt читаем строку "Новая папка" и записываем её в file1.txt. В итоге в file1.txt оказывается строка "Ќова¤ папка". Из-за чего может быть такое?
...
Рейтинг: 0 / 0
Непонятки с массивом
    #38898061
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivлет 10 назад уже было все однозначно....
Пусть так. Только STL с юникодом только-только начала дружить, и то не полностью...

MasterZivBagaBaga
Про кодировки и прочее. У Вас нормально отработает
cat filename | sed 's/право/лево/' > newfile
если консоль u8 (или KOI8, или ещё какая), а файл, например, в старой доброй cp866 (или другой, не той, что в консоли)?


нет, конечно, но

export LANG=xxxx

и вперед...
Так-то можно, но в этом уже никакой магии ...
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Непонятки с массивом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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