Функция искажает данные передаваемого в него аргумента
При передаче аргументом символьного массива в функцию checking1() данные искажаются(смотрел в дебаггере).
// main.cpp
#include <iostream>
#include <iomanip>
#include "Validate.h"
using std::cout;
using std::endl;
char* getString_User(){
const int SIZE_BUF = 40;
char buf[SIZE_BUF];
cout << "Enter expression: ";
return gets(buf);
}
int main() {
char* str = getString_User();
cout << std::boolalpha<< checking1(str) << endl;
return 0;
}
// Validate.hpp
#ifndef CALCULATOR_VALIDATE_H
#define CALCULATOR_VALIDATE_H
bool checking1(const char* string) // 364362894++--(--) --> true
{
const char SPECIAL_SYMBOLS[] = "0123456789+-*/()";
for(int i = 0; string[i] != '\0'; i++)
{
char symbolString = string[i];
bool flag = true;
for(int j=0; SPECIAL_SYMBOLS[j] != '\0'; j++)
{
char symbolSpecialSymbols = SPECIAL_SYMBOLS[j];
if(symbolString == symbolSpecialSymbols)
{
flag = false;
}
}
if(flag)
{
return false;
}
}
return true;
}
#endif //CALCULATOR_VALIDATE_H
Ответы (1 шт):
Автор решения: lenivoe
→ Ссылка
Функция getString_User возвращает адрес массива buf, который был создан внутри, то есть локально.
При завершении функции массив buf будет уничтожен. Адрес, который вернет функция будет указывать на место, где существовал массив. Однако, раз массива уже нет, на то же место в памяти уже могли быть записаны другие данные.
Можно решить проблему двумя (тремя) способами.
- Передавайте в функцию
getString_Userуже созданный массив. То есть, создайте его в функции main. Так как массив будет создан вне функцииgetString_User, она не будет его уничтожать. - Внутри
getString_Userсоздавайте динамический массив и возвращайте его адрес. Динамические массивы не ограничены областью видимости. Программист вручную управляет их временем жизни через операторыnewиdelete[]. - Для полноты ответа третий способ. Можно сделать массив
bufстатическим. Тогда он не будет уничтожаться по завершению функции и продолжит существовать до завершения программы. Однако использование статических (ровно как глобальных) переменных усложняет разработку, приводит к путанице, поэтому в настоящее время не рекомендуется.
char* getString_User(){
const int SIZE_BUF = 40;
// массив живет вечно, никому память не отдает, данные не портятся
static char buf[SIZE_BUF]; // не рекомендуется
cout << "Enter expression: ";
return gets(buf);
}
Советую глянуть про области видимости переменных, про висячие указатели и ссылки.

