Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 74
Записей в блоге: 1

Теряется строка при передаче в функцию

04.03.2015, 14:45. Показов 1829. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет
Замучался копать уже. Теряется строка при передаче её в функцию. Код такой:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char* Read()
{
    char  str[] = "1 2 3 4";
    return str;
}
 
char* TString::Spt(char *str)
{
    char *s = str; //здесь ожидаю что s будет содержать "1 2 3 4", но вместо этого кракозябры. То же во входной str
 
    return s;
}
 
char *str = Read();   //здесь str содержит "1 2 3 4" - ок
char *res = TString::Spt(char *str); //здесь res не содержит "1 2 3 4"
Почему такое может быть? Если сделать char *str = "1 2 3 4"; и так передать в Spt(str) то всё ок.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2015, 14:45
Ответы с готовыми решениями:

При передаче указателя в качестве аргумента функции теряется значение
Добрый день. Есть простенькая задачка сделать связанный список. При этом создается первый эелемнт списка с нулевым указателем на...

При переходе из метода в главную функцию теряется информация
Задача: описать класс "безопасный массив целых чисел". Все бы хорошо, но при переходе из перегруженных операторов + и * возникают проблемы:...

Ошибка при передаче в функцию
Хочу передать в функцию строку и там ее заполнить, подчеркивает void karta(MyStruct s.karta,int size); И пишет: 1 IntelliSense:...

7
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.03.2015, 14:54
Ты возвращаешь локальную строку. Она существует только внутри функции Read(). Используй лучше string, или если по-древнему, то передавай указатель на буфер, а функция пусть его заполняет.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.03.2015, 15:16
Цитата Сообщение от nmcf Посмотреть сообщение
Ты возвращаешь локальную строку.
Может для ТС будет понятнее, если сказать, что это не строка возвращается как таковая, а лишь указатель (на локальные для функции Read данные).
0
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 74
Записей в блоге: 1
04.03.2015, 16:24  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Ты возвращаешь локальную строку. Она существует только внутри функции Read(). Используй лучше string, или если по-древнему, то передавай указатель на буфер, а функция пусть его заполняет.
Если передать указатель на буффер то опять не пойми чего получается:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void Read(char* buff)
{
    buff= "1 2 3 4";
}
 
 
char buff[8];
Read(buff);
 
char* t = str; //здесь t содержит какие-то символы вместо "1 2 3 4"
Добавлено через 3 минуты
Я бы использовал std::string, но что-то не могу въехать как функции вернуть массив string[].
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.03.2015, 16:26
Цитата Сообщение от rigorMortis Посмотреть сообщение
Если передать указатель на буффер
"Вы просто не умеете их готовить."
C++
1
2
3
4
void Read(char* buff)
{
    strcpy( buff, "1 2 3 4" ); // Не забыть проверить размер приемного буфера
}
Добавлено через 44 секунды
Цитата Сообщение от rigorMortis Посмотреть сообщение
Я бы использовал std::string, но что-то не могу въехать как функции вернуть массив string[].
Как задание поставлено?
0
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 74
Записей в блоге: 1
04.03.2015, 16:59  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Как задание поставлено?
Надо в функцию передать строку, разбить на элементы строк (разделитель пробел) и вернуть массив того что получилось. Думал так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char** TString::Split(char* str)
{
    int i = 0;
    char *resltStr[100];
    char *token, *last;
 
    token = strtok_s(str, " ", &last);
    while (token != NULL)
    {
        size_t size = strlen(token) + 1;
        resltStr[i] = (char*)malloc(sizeof(char)*size);
        resltStr[i++] = token;
        token = strtok_s(NULL, " ", &last);
    }
 
    return resltStr;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.03.2015, 17:10
Если на C++, то всё относительно просто:
http://stackoverflow.com/quest... tring-in-c
Если понимать, что происходит, конечно
0
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 74
Записей в блоге: 1
04.03.2015, 19:59  [ТС]
Спасибо, помогло
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2015, 19:59
Помогаю со студенческими работами здесь

Ошибка при передаче параметра в функцию
В ДЗ есть пример кода, помогите пожалуйста исправить, до работающего варианта (VS2015). Ошибки: (32) error C2660: strcpy_s: функция не...

Порча указателя при передаче в функцию
Добрый вечер. Проблема такая - при передаче в функцию структуры, полем которой является указатель на указатель, последний портится....

Мусор в элементах массива при передаче в функцию
Доброго времени суток, столкнулся с данной проблемой в CLI, попробовал реализовать аналог для консольного приложения всё работает, почему...

Выдает ошибку при передаче массива в функцию
Ругается на 59 строку: 2.cpp(59): error C2664: otn: невозможно преобразовать параметр 4 из "double **" в "double" ...

Неправильная длина строки при передаче в функцию
странная работа компилятора(строки) в кратце проблема выглядет так определяем переменную типа широкой строки считаем ее длину...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru