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

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

18.08.2014, 18:31. Показов 2473. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru