Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 1
Регистрация: 18.08.2014
Сообщений: 31

Странное поведение компилятора из-за слешей в пути

18.08.2014, 18:31. Показов 2517. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <Shlobj.h>
#include <Synchapi.h>
#include <Psapi.h>
#include <stdlib.h>
#include <string>
//#pragma comment( linker, "/subsystem:windows")//,5.01" )
//#pragma comment( linker, "/ENTRY:main" )
//#pragma comment(lib, "WinMM.Lib")
using namespace std;
int main()
{
    setlocale(0, "");
    char szFolderPath[MAX_PATH];
    char szExePath[MAX_PATH];
    //HKEY hk;
    //HANDLE hToken;
    //TOKEN_PRIVILEGES tkp;
    GetModuleFileName(NULL, szExePath, sizeof(szExePath));
    SHGetSpecialFolderPath(NULL, szFolderPath, CSIDL_LOCAL_APPDATA, NULL);
    string string1(szExePath);
    int position = string1.find("\\");
    // 
    while (position != string::npos)
    {
        string1.replace(position, 1, "2");
        position = string1.find(" ", position + 1);
    }
    cout << string1;
    system("pause");
}
с знаком "\\" компилит, а с "\" как мне надо, нет....
просто когда в переменную szExePath или szFolderPath записывается путь, то он получается с одним слэшем, а мне надо чтобы было два...как быть?
Миниатюры
Странное поведение компилятора из-за слешей в пути  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.08.2014, 18:31
Ответы с готовыми решениями:

Странное поведение компилятора
Всем привет! Я конечно понимаю что нужно выкладывать минимальный код повторяющий мою проблему но он будет достаточно грамосток т.к. в...

Странное поведение компилятора MinGW
#include &lt;iostream&gt; using namespace std; int main() { char str=&quot;Lorem ipsum&quot;; char q='s'; char *p=&amp;q; cout...

Изменение слешей в пути
Привык работать с &quot;/&quot;, но iis пишет &quot;\&quot; (т.к. винда), есть способ заставить работать с &quot;/&quot;? Добавлено через 16 минут ...

18
0 / 0 / 1
Регистрация: 18.08.2014
Сообщений: 31
18.08.2014, 18:41  [ТС]
Вот что пишет, когда ставишь "\" вместо "\\".
а на самом деле с синтаксисом всё нормально.
Миниатюры
Странное поведение компилятора из-за слешей в пути  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
18.08.2014, 21:34
Цитата Сообщение от flaber Посмотреть сообщение
int position = string1.find('\\');
- слеш ищется таким образом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string>
#include <iostream>
using namespace std;
 
string path = "C:\\Windows";
 
int main(){
    size_t pos = path.find('\\');
    if( pos == string::npos )
        cout<<"string::npos"<<endl;
    else
        cout<<"slash pos : "<<pos<<endl;
    cin.get();
    return 0;
}
slash pos : 2
http://codepad.org/D6eyAvUf
2
0 / 0 / 1
Регистрация: 18.08.2014
Сообщений: 31
18.08.2014, 22:13  [ТС]
-=ЮрА=-, это понятно но мне надо заменить в переменной \ на \\)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
18.08.2014, 23:07
Цитата Сообщение от flaber Посмотреть сообщение
-=ЮрА=-, это понятно но мне надо заменить в переменной \ на \\)
- я тебя не понял
Цитата Сообщение от flaber Посмотреть сообщение
"\"
- так строку задать нельзя, т.к \" означает символ кавычек и "\" трактуется компилятором как открывающая стркоа для текста0 кавычка и ошбика - нет закрывающей скобки.

Добавлено через 3 минуты
Теперь ещё раз внятно поясни чего ты хочешь?
предположу что считаешь такую запись
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
"C:\\Windows";
как С: и два слеша - нет это один слеш - символ задаётся '\\' и строка из 1-го символа также "\\"
http://codepad.org/ChkrDYjg

Добавлено через 1 минуту
Если же ты хочешь найти подсткрку с двумя подряд слешами то следует писать так
C++
1
path.find("\\\\")

Не по теме:

Хочешь знать больше?

Кликните здесь для просмотра всего текста

1
0 / 0 / 1
Регистрация: 18.08.2014
Сообщений: 31
18.08.2014, 23:09  [ТС]
-=ЮрА=-, аа, теперь понял!
ну всмысле функция GetModuleFileName возвращает в переменную szExePath путь, откуда запущен exe'шник, если его вывести через cout текстом, то он будет выглядеть так : "C:\bla\bla\bla\bla.exe
а мне надо заменить в этой переменной один слэш - двумя...вот я и не знаю как это сделать...
при условии когда читает // (как бы 1 слэш) и заменяет на //// (2 слэша) результат получается, но заменяется только первый слэш двумя, т.е. C:\\bla\bla\bla\
парадокс
Миниатюры
Странное поведение компилятора из-за слешей в пути   Странное поведение компилятора из-за слешей в пути   Странное поведение компилятора из-за слешей в пути  

0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
18.08.2014, 23:16
flaber, ну ты даёшь у тебя позиция слеша находится ещё до цикла а в цикле ищешь пробел " " ясное дело 1-й слеш заменится, а затем цикл уже ищет пробелы
1
0 / 0 / 1
Регистрация: 18.08.2014
Сообщений: 31
18.08.2014, 23:19  [ТС]
а хотя на c++ 2 слэша транслируются как 1 т.е. и у меня открывается папка...вопрос отпал)спасибо
теперь второй вопрос, как к переменной добавить свой путь?т.е. в ней содержится путь к папке AppData/Roaming, а я хочу открыть еще одну папку в папке Roaming
т.е. ShellExecute(NULL, "open", szFolderPath, NULL, NULL, SW_SHOWNORMAL);
надо добавить путь к szFolderPath, только как это сделать?я новичёк в c++

Добавлено через 48 секунд
-=ЮрА=-, аа ну да ахахахахаха, бездумно вставил код и теперь думаю что не работает)спасибо
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
18.08.2014, 23:19
Цитата Сообщение от flaber Посмотреть сообщение
теперь второй вопрос, как к переменной добавить свой путь?т.е. в ней содержится путь к папке AppData/Roaming, а я хочу открыть еще одну папку в папке Roaming
C++
1
string path = string("AppData\\Roaming")  + string("\\SomeFolder");
0
0 / 0 / 1
Регистрация: 18.08.2014
Сообщений: 31
18.08.2014, 23:23  [ТС]
-=ЮрА=-, Thanks you
0
18.08.2014, 23:24

Не по теме:

flaber, на здоровье;)

0
0 / 0 / 1
Регистрация: 18.08.2014
Сообщений: 31
18.08.2014, 23:37  [ТС]
-=ЮрА=-, а как это же сделать только для типа char?
char myPath[MAX_PATH] = char(szExePath) + char("\\Adobe"); // не канает
подскажи синтаксис)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
18.08.2014, 23:41
Массив чаров - это не контейнер и перегруженного + для конкатениции не имеет, нужно стыковать "дедовскими" методами
C++
1
sprintf(myPath, "%s\\%s", szExePath, "Adobe");
Добавлено через 1 минуту
можно ещё использовать strcat
1
0 / 0 / 1
Регистрация: 18.08.2014
Сообщений: 31
19.08.2014, 00:33  [ТС]
-=ЮрА=-, с sprintf вылетало когда я делал #pragma comment( linker, "/subsystem:windows")//,5.01" ) (т.е. не консольное приложение)
а с strcat всё ок!
спасибо тебе большое!всё работает!!!!
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.08.2014, 08:55
flaber, спринтф сам по себе не вылетает,показывай код.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.08.2014, 15:22
-=ЮрА=-, а в студии нет специальной константы - разделителя именно пути? В борланде существует PathDelim, отвечающая как раз за это.
0
0 / 0 / 1
Регистрация: 18.08.2014
Сообщений: 31
19.08.2014, 16:14  [ТС]
-=ЮрА=-, потом сделаю, ща другая трабла появилась...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    while (cin.get(c) && c != '\n')
    {
        //a = a + 1;
        b = atoi(&c);
        /*if (isdigit(c))
        {
 
        }
        else
        {
            MessageBox(0, "Вводить можно только цифры", "Предупреждение", MB_ICONWARNING);
        }
        if (a > 5)
        {
            MessageBox(0, "Максимальное количество символов: 5", "Предупреждение", MB_ICONWARNING);
            break;
        }*/
        if (b > 5)
        {
            MessageBox(0, "Максимальное количество символов: 5", "Предупреждение", MB_ICONWARNING);
            break;
        }
    }
system("pause");
не выскакивает сообщение когда я ввожу число больше 5, в чём может быть проблема?
хотя когда я вывожу cout << b всё нормально
см. скрин
Миниатюры
Странное поведение компилятора из-за слешей в пути  
0
0 / 0 / 1
Регистрация: 18.08.2014
Сообщений: 31
19.08.2014, 18:46  [ТС]
Разобрася, это всё из-за того что считывает посимвольно!
а есть ли функция, которая считывает поток сразу?и чтобы можно было ограничить ввод,наподобии этого?

Не по теме:

P.S.:в c++ я новичек :)



Добавлено через 46 минут
Сделал по-другому
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    cin >> c;
    a = strlen(c);
    b = atoi(c);
    if (a > 5)
    {
        MessageBox(0, "Максимальное количество символов: 5", "Предупреждение", MB_ICONWARNING);
    }   
    if (isdigit(b))
    {
 
    }
    else
    {
        MessageBox(0, "Вводить можно только цифры", "Предупреждение", MB_ICONWARNING);
    }
но после ввода "123456" и нажатии на предупреждении "ок" получается вылет
если по отдельности сделать либо
C++
1
2
3
4
5
6
7
8
if (isdigit(b))
    {
 
    }
    else
    {
        MessageBox(0, "Вводить можно только цифры", "Предупреждение", MB_ICONWARNING);
    }
либо
C++
1
2
3
4
 if (a > 5)
    {
        MessageBox(0, "Максимальное количество символов: 5", "Предупреждение", MB_ICONWARNING);
    }
то всё работает корректно, и консоль закрывается сама, без вылетов
но как только эти 2 if вместе, то получается вылет именно после ввода "123456", а если ввести допустим "фыва" тоесть будет работать второе условие (на проверку ввода цифр) то предупреждение выскакивает и после нажатия "ОК" консоль закрывается без вылетов...парадокс
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.08.2014, 21:03
flaber, на счёт вводить цифры - тебе сюда
Безопасный ввод через функцию-шаблон


Добавлено через 1 минуту
подумай что будет если в тех 5 символах сделать ввод 5abcd (как думаешь это корректный ввод?)
На счёт числа вводимых символов - это делается за счёт ограничния в методах ввода, конкретно каких я смогу сказать когда увижу конкретный код.

Добавлено через 10 минут

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
-=ЮрА=-, а в студии нет специальной константы - разделителя именно пути?
- честно никогда не встречал, кроме универсального файлового идентификатора я никаких особых символьных префиксов не знаю.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.08.2014, 21:03
Помогаю со студенческими работами здесь

Смена слешей в пути \ на /
@echo off set &quot;compile_bin=%~dp0TDM-GCC-64\bin&quot; set &quot;compile_lib=%~dp0TDM-GCC-64\lib&quot; set &quot;additional_files=%~dp0Sublime Text...

Непонятное поведение компилятора
При запуске программы пишет build sucessful. При следующем запуске ничего не происходит: нету ни окна в области Build пусто, в процессах...

неадекватное поведение компилятора
ни как не могу понять почему в коде uint8_t espAT(char *sommomd) { prymtf(sommomd); // отключаем команду модему do { ...

непонятное поведение компилятора gcc
для отладки работы контролера mego328 через uart, написан такой кусок кода send_Uart_str(&quot;IRQ\t\t&quot;); if...

Странное поведение
привет всем. Пишу тут одну работку вот код добавления нового товара. Я использую поле Акция, если выбран yes появляется еще поле с новой...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru