Форум программистов, компьютерный форум, киберфорум
FASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для semiono
161 / 18 / 0
Регистрация: 14.09.2010
Сообщений: 472
Записей в блоге: 6
FASM

Существует ли WinAPI для подготовки строки PATH к использованию в wsprintf - удвоить в строке одиночные '\'

03.04.2021, 00:28. Показов 2632. Ответов 6

Студворк — интернет-сервис помощи студентам
Парни, как конвертировать строку PATH с заменой \ на \\
Готовых MSDN решений в виде API похоже что наверное нет?
Ох, побайтово что-то изобретать даже боюсь подумать!
Всего лишь строку надо конвертнуть внутри кода, скажем GetCurrentDirectory()
Мне потом надо в wstprintf() вставить строку.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2021, 00:28
Ответы с готовыми решениями:

Удвоить все одиночные пробелы в предложении
2) Удвойте все одиночные пробелы в предложении. Спасибо заранее))

как можно выводить данные c помошью wsprintf() (winApi)
как можно вывести value=100 чет не получается int value =100; WCHAR szText; wsprintf(szText,TEXT("vaue = %d"),value);

Строки и множества. Удвоить каждое вхождение символа «а» в строке
помогите пожалуйста решить задачу Удвоить каждое вхождение символа «а» в строке.

6
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.04.2021, 11:05
Слабо знаком с составом и возможностями WinAPI, а для конкретно этой задачи решал бы так:
1. сосчитать количество '\' в строке
2. получить новую длину строки
3. начиная с последнего символа, копировал в конец новой строки до равенства указателей, и одновременно удваивал требуемые символы.
1
 Аватар для semiono
161 / 18 / 0
Регистрация: 14.09.2010
Сообщений: 472
Записей в блоге: 6
03.04.2021, 15:43  [ТС]
Кликните здесь для просмотра всего текста
Code
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
include '%fasm%/win64w.inc' ;; 'win64w.fincg'
format PE64 CONSOLE ;; 6.2 at 0x1_0000
section '.flat' code readable executable writeable
 
 
multi_concatenation:
        pop rdx
        xchg rax,rsi
.strcpy:
        pop rsi
.copy:  movsb
        cmp byte [rsi],0
        jnz .copy
        cmp qword [rsp],0
        jnz .strcpy
        xchg rax,rsi
        pop rax
        jmp rdx
 
 
Example:
virtual at RBP - .FRAME
                        dq ?,?,?,?
        .P5             dq ?,?
 
        .FRAME := $ - $$
assert .FRAME and 15 = 0
end virtual
        entry $
        enter .FRAME,0
 
; GetCurrentDirectory
; SHGetFolderPath
        mov ecx,sizeof input_buffer
        lea rdx,[input_buffer]
        call [GetCurrentDirectoryA]
        test eax,eax
        jz .fail
 
; pretend we don't know where the path came from, scan string to find end
        push rdi
        lea rdi,[input_buffer]
        mov ecx,-1
        xor eax,eax
        repnz scasb
        ; RDI points to byte after zero byte!
        not ecx ; string bytes
        sub ecx,1
        jz .fail ; zero length path
 
        std ; move backward from end of string
        scasb ; backup to zero byte
        mov al,'\'
        push 0 ; terminator for multi_concatenation
; gather non-slash fragments
.more:
        mov byte [rdi+1],0 ; null terminate this fragment
        repnz scasb
        lea rdx,[rdi+2] ; our string fragment ; RDI is byte before slash
        push rdx
        lea rdx,[slashslash]
        push rdx
        jz .more
        pop rdx
        pop rdx
        push rdi ; last fragment is always string start
 
        cld ; back to default direction
        lea rdi,[output_buffer]
        call multi_concatenation
        xchg eax,edi
        lea rdi,[output_buffer]
        sub eax,edi ; byte in output buffer
        pop rdi
        mov dword [.P5],eax
 
        push STD_OUTPUT_HANDLE
        pop rcx
        call [GetStdHandle]
        xchg rcx,rax
        xor r9,r9
        mov r8d,dword [.P5]
        lea rdx,[output_buffer]
        mov [.P5],r9
        call [WriteConsoleA]
.fail:
        leave
        retn
 
slashslash db '\\',0
 
libraries 'kernel32' ; import section
 
 
label input_buffer:4096
rb sizeof input_buffer
 
label output_buffer:4096
rb sizeof output_buffer


Есть какой-то суровый код, у меня он не запускается, неловко у автора было спросить

.FRAME := $ - $$

Illegal instruction, видимо там персонифицированные инклюды с массой дополнений.
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
03.04.2021, 16:32
Лучший ответ Сообщение было отмечено semiono как решение

Решение

Цитата Сообщение от semiono Посмотреть сообщение
Ох, побайтово что-то изобретать даже боюсь подумать!
..а чё там думать?
тем-более что без копирования строки в новый буфер можно получить переполнение:

Assembler
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
31
32
format   pe console
include 'win32ax.inc'
entry    start
;//----------
.data
oldStr    db  'D:\Install\FASM\INCLUDE\API',0
buff      db  128 dup(0)
;//----------
.code
start:  invoke  lstrlen,oldStr    ;// вычисляем размер строки
        xchg    ecx,eax           ;// ECX = длина цикла
        mov     esi,oldStr        ;// источник
        mov     edi,buff          ;// приёмник
@@:     lodsb                     ;// читаем байты из ESI
        cmp     al,'\'            ;// тест..
        jne     @next             ;// нет
        mov     word[edi],'\\'    ;// иначе: запись в приёмник
        inc     edi               ;// указатель +1
@next:  stosb                     ;// перемещение текста по байтам
        loop    @b                ;// промотать ECX-раз..
 
       cinvoke  printf,<10,' Old string: %s',0>,oldStr
       cinvoke  printf,<10,' New string: %s',0>,buff
 
@exit: cinvoke  getch
       cinvoke  exit,0
;//---------------
section '.idata' import data readable
library  msvcrt,'msvcrt.dll',kernel32,'kernel32.dll',user32,'user32.dll'
import   msvcrt, printf,'printf',getch,'_getch',exit,'exit'
include 'api\kernel32.inc'
include 'api\user32.inc'
2
653 / 161 / 64
Регистрация: 08.04.2015
Сообщений: 410
03.04.2021, 18:37
Цитата Сообщение от semiono Посмотреть сообщение
как конвертировать строку PATH с заменой \ на \\
Всего лишь строку надо конвертнуть внутри кода, скажем GetCurrentDirectory()
Мне потом надо в wstprintf() вставить строку
А вы уверены, что это на самом деле нужно?
В исходниках действительно пишут так:
C
1
printf("%s", "C:\\Windows\\System32");
Это для компилятора, чтобы он правильно строку обработал. В исполняемом файле эта самая строка будет уже с одиночными слэшами. Если у вас строка получается в рантайме, то зачем в ней удваивать слэши?
3
 Аватар для semiono
161 / 18 / 0
Регистрация: 14.09.2010
Сообщений: 472
Записей в блоге: 6
03.04.2021, 20:00  [ТС]
Конечно, уверен!
Мне надо в конфиг програмы записать путь к данным, у каждого свои причуды, вот они решили там двойные исползовать,
небось питон или чтонибудь кросплатформенное использовали отсюда и странности.
Я вот нечто такое искал UrlCreateFromPathA или SHGetFolderPathAndSubDirA, хотя надо поизучать, может есть всё же
подходящее среди функций, я вот обратную функу UrlCreateFromPathA знал, а эту только увидел сейчас

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

Всем спасибо!
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.04.2021, 20:12
semiono, мне кажется, что данное решение некорректно по причинам:
1) 32 разрядная адресация в 64 разрядной программе
2) нет оценки возможности переполнения - всё же правильнее было бы перед удвоением символов уточнить будущую длину строки
3) корректно использовать кодировку ANSI, а не UniCode?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.04.2021, 20:12
Помогаю со студенческими работами здесь

В строке удвоить символы. Удвоить строку. 2 разные программы
В строке удвоить символы. Удвоить строку. 2 разные программы

В строке символов удалить все пробелы в начале и в конце строки, удвоить пробелы в середине строки и напечатать количество слов
В строке символов удалить все пробелы в начале и в конце строки, удвоить пробелы в середине строки и напечатать количество слов. ...

Существует ли аналог WinAPI для работы с HWND?
существует ли аналог winapi для работы с HWND ? #if defined (__WIN32__) #include &lt;windows.h&gt; HWND hWnd =...

Есть ли толковая документации по использованию WinApi в FASM?
Есть ли толковая документации по использованию winapi в fasm'e ?

Одиночные замены в строке по функции
Здравствуйте, у меня есть строка и мне в ней нужно заменить заменить одни и теже слова но на разные которые генерируются с помощью функции.


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru