Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 2
Регистрация: 11.10.2016
Сообщений: 116
1

Удалить в тексте лишние пробелы, оставив между словами не больше двух пробелов

27.11.2017, 21:30. Просмотров 1849. Ответов 7
Метки нет (Все метки)

Есть строка str1 (в строке предложение и между словами может быть от 0 до n пробелов). Как сделать так чтобы переписать строку str1 в str2 и в ней осталось не больше двух пробелов, я начал писать и завис, ругает команду сканирования scasb
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
33
34
35
36
37
38
39
40
41
.model small
.8086
 
.data
str1 db 'Для    чего  они    нужны и как их использовать$'
;строка которую копируют 
str2 db 50 dup (' ') 
;строка в которую копируют
n=$-string ;длина строки
 
.stack 256
 
.code 
start: 
 
mov ax, data
mov ds, ax 
mov es, ax
 
cld    ;обработка от начала к концу
lea si, str1    ;цепочка-источник
lea di, str2    ;цепочка-приемник
mov cx, n      ;загрузка кол-ва эл-тов 
mov al, ' '    ;загрузка символа пробела 
push si
push cx 
rep scasb str1       ;cканирование цепочки    
mov cx, si
sub cx, bx
mov bx, si     ;хранить в регистре индекс
pop cx
pop si     
rep movsb      ;копируем строки
    mov ah, 09 
    lea dx, str2 ;выводим строку
    int 21h
    
    mov ax, 4c00h ;перессылка функции выхода из программы
    int 21h
 
end start
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2017, 21:30
Ответы с готовыми решениями:

Дан текст, состоящий из слов, разделенных произвольным числом пробелов. Удалить из текста лишние пробелы, оставив по одному между словами
Преобразования строк. Обработка строк с применением циклов Дан текст, состоящий из слов,...

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

В тексте убрать лишние пробелы между словами, оставив по одному
Составить программу обработки строк. Текст помещать в Memo. В тексте убрать лишние пробелы между...

Удалить лишние пробелы, оставив только по одному между словами.
Дан текст, состоящий из N строк. Слова разделены несколькими пробелами. Требуется удалить лишние...

7
Модератор
Эксперт по электронике
7410 / 3629 / 1424
Регистрация: 01.02.2015
Сообщений: 11,314
Записей в блоге: 2
27.11.2017, 21:49 2
Команде не нужны параметры.
Искомый символ в al.
Начало строки в es:di
Длина строки не превышает cx.

https://www.cyberforum.ru/post5516354.html
0
0 / 0 / 2
Регистрация: 11.10.2016
Сообщений: 116
27.11.2017, 22:07  [ТС] 3
ФедосеевПавел, я не совсем понимаю, ибо в асме почти не шарю
0
Модератор
Эксперт по электронике
7410 / 3629 / 1424
Регистрация: 01.02.2015
Сообщений: 11,314
Записей в блоге: 2
27.11.2017, 22:15 4
Пройдите по ссылке - там пояснения.

Добавлено через 59 секунд
Я не понимаю вашего алгоритма, поэтому ничего не могу исправлять кроме синтаксических ошибок.
0
0 / 0 / 2
Регистрация: 11.10.2016
Сообщений: 116
27.11.2017, 22:20  [ТС] 5
ФедосеевПавел, а как бы вы решали задачу?
0
Модератор
Эксперт по электронике
7410 / 3629 / 1424
Регистрация: 01.02.2015
Сообщений: 11,314
Записей в блоге: 2
27.11.2017, 22:23 6
Никак. Я не понимаю её условие. Видимо, вы привели собственную трактовку, а не исходную постановку задачи.
0
0 / 0 / 2
Регистрация: 11.10.2016
Сообщений: 116
27.11.2017, 22:35  [ТС] 7
ФедосеевПавел, Если дословно то: "Удалить в тексте лишние пробелы, оставив между словами не больше двух пробелов"
0
Модератор
Эксперт по электронике
7410 / 3629 / 1424
Регистрация: 01.02.2015
Сообщений: 11,314
Записей в блоге: 2
27.11.2017, 23:25 8
Без цепочечных команд.

1. Настроить ds:si и es:di на начало строки
2. Считать в al значение [si]. si=si+1 (можно lodsb)
3. Если в al пробел - увеличить счетчик пробелов на 1, иначе счётчик пробелов равен 0.
3. Проверить счётчик последовательных пробелов на превышение 2. Если не превышает, то записать значение al в [di] и di=di+1 (можно stosb)
И так до конца строки.

Добавлено через 34 минуты
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
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
.model small
.8086
 
.data
        ;строка которую копируют
        str1    db      'Для    чего  они    нужны и как их использовать$'
        ;строка в которую копируют
        str2    db      50 dup (?)
        ;перевод строки
        CrLf    db      0Dh, 0Ah, '$'
        TERMINATOR      equ     '$'
 
.stack 256
 
.code
start:
 
        mov     ax,     @data
        mov     ds,     ax
        mov     es,     ax
 
        ;вывод исходной строки
        mov     ah,     09h
        lea     dx,     [str1]
        int     21h
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
        ;обработка строки с размещением результата в новой строке
        ;пусть признаком конца строки является символ '$'
        cld                     ;обработка от начала к концу
        lea     si,     [str1]  ;цепочка-источник
        lea     di,     [str2]  ;цепочка-приемник
        mov     bx,     0       ;счётчик пробелов
        @@Repeat:
                lodsb           ;считать в al очередной символ
                cmp     al,     ' '
                jne     @@NoSpace
                inc     bx      ;увеличить счетчик пробелов на 1
                jmp     @@IsAboveTwoSpaces
        @@NoSpace:
                mov     bx,     0       ;счётчику пробелов присвоить 0
        @@IsAboveTwoSpaces:
                cmp     bx,     2       ;если количество пробелов не превышает 2
                ja      @@SkipCharCopy
                stosb           ;сохранить символ в результирующей строке
        @@SkipCharCopy:
        @@Until:
                ;это символ - признак конца строки?
                cmp     al,     TERMINATOR
        jne     @@Repeat
        ;вывод результирующей строки
        mov     ah,     09h
        lea     dx,     [str2]
        int     21h
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
 
        mov     ax,     4c00h ;перессылка функции выхода из программы
        int     21h
 
end start
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2017, 23:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Удалить из файла лишние пробелы, оставив по одному между словами
Добрый день. Помогите с программой. Заранее спасибо. Дан файл, содержащий некоторый текст....

Удалить все лишние пробелы, оставив по одному между словами
Задание "Написать программу, в которой вводится строка из слов с некоторым количеством пробелов...

Удалить в строке лишние пробелы, оставив между словами ровно по одному
Дана строка состоящая из слов, между которыми есть некое количество пробелов. Требуется удалить...

Удалить из файла все лишние пробелы, оставив между словами не более одного пробела
Доброго времени суток. Помогите пожалуйста решить задачу: Дан текстовый файл. Удалить из него все...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.