Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Удаление от начала / от конца строки / Delphi XE4

Сделал вот так (Но файлы размером в 500 мегабайт не обрабатывает - нехватка памяти):

    procedure TForm1.Button1Click(Sender: TObject);
    var t:TStringList;
        s: string;
        k,n,i: integer;
    begin
    n:=strtoint(Edit1.Text);//удалить в начале
    k:=strtoint(Edit2.Text);//удалить в конце
    t:=TStringList.Create;
    t.LoadFromFile('1.txt');//файл в папке с программой
    for i:=0 to t.Count-1 do
     begin
      s:=t[i];
      if k>=length(s) then s:=''
      else delete(s,length(s)-k+1,k);
      if n>=length(s) then s:=''
      else delete(s,1,n);
      t[i]:=s;
     end;
    t.SaveToFile('2.txt');
    t.Free;
    ShowMessage('Файл 1.txt преобразован и записан в файл 2.txt')
    end;


Как переделать через: AsssignFile, Reset/Rewrite, CloseFile то есть читать по строкам а не загружать в память.
Ответ:
^D^imaПомог, спасибо!
Вопрос: Удалить все пробелы в начале и в конце строки

Дана символьная строка.Удалить все пробелы в начале и в конце строки.
Помогите решить пожалуйста.[DELPHI]
Ответ:
Сообщение от smertnik67
Дан лиш этот материал
Тогда можно сделать с использованием функции Length() и процедуры Delete():
Delphi
1
2
3
4
5
 //задаете s - исходную строку
...
While s[1]=' ' do Delete(s, 1, 1); //удаляем в начале
While s[Length(s)]=' ' do Delete(s, Length(s), 1); //удаляем в конце
...
Вопрос: Программирование с использованием строк Delphi

Помогите пожалуйста!!! Заранее спасибо)
_____________________________________________________________________________________________
Дана строка символов, состоящая из произвольных десятичных цифр, разделенных пробелами. Вывести четные числа этой строки.
Ответ: wendstor, последнее число не захватит, для этого нужно в конец строки добавить пробел (разделитель)
Pascal
1
If Decimal[Length(Decimal)]<>' ' then tmp:=Decimal+' ' else tmp:=Decimal;
Вопрос: Добавить слеш в начало каждый строки Memo

Как в Memo добавить слеш в начало каждый строку и чтобы длина строки не было больше 35 Символ
Ответ: for i:=0 to memo1.lines.count-1 do
memo1.lines[i]:='/'+copy(memo1.lines[i],1,34)
Все строки будут начинаться со слеша (можете поменять '/' на '\' если нужно) и иметь длину не более 35 символов, включая слеш
Вопрос: Определить, какое слово - максимальной или минимальной длины - находится ближе к концу строки

Помогите пожалуйста.
Дана строка символов. Определить, какое слово - максимальной или минимальной длинны - находится ближе к концу строки.
Ответ:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
begin
  var S := ReadLnString('Введите текст:');
  var d := (' .').ToCharArray; // Слова в строке разделены пробелами и точками
  var minL := Integer.MaxValue;
  var maxL := 0;
  foreach var W : String in S.ToWords(d) do
    begin
      minL := min(minL, W.Length);
      maxL := max(maxL, W.Length);
    end;
  if maxL = 0 then
    WriteLn('Слов нет!')
  else if minL = maxL then
    WriteLn('Ни какое из слов не находится ближе к концу строки')
  else
    WriteLn('Ближе к концу находится слово м', (minL > maxL ? 'ин' : 'акс'), 'имальной длины.');
end.
Вопрос: Как удалить цифры в скобках на концах строк?

Пожалуйста подскажите, как в Notepad++ удалить цифры в скобках вместе со скобками на концах строк.

Строка текста 1 (24)
Строка текста 2 (6)

Строка текста 3
Строка текста 4 (187)
Строка текста 5 (168)
Ответ:
supmener пишет:
Пожалуйста подскажите, как в Notepad++ удалить цифры в скобках вместе со скобками на концах строк.

Строка текста 1 (24)
Строка текста 2 (6)

Строка текста 3
Строка текста 4 (187)
Строка текста 5 (168)

Ctrl+H -> В "найти" пишем пробел, далее наклонная черта влево, открываем скобку, далее точка, далее звёздочка. В "заменить на" оставляем строку пустой. Слева внизу ставим точку на "Рег. Выражения", жмём заменить всё. Профит.
Вопрос: Символы в конце строк

Доброе время суток. Подскажите пожалуйста как в данном коде убрать пробелы в конце строк
Сам код:
Python
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
import datetime
stroka = 20 
def create_calendar_page (month = None, year = None):
                x = datetime.datetime.today()
                if month == None:
                        month = x.month
                else:
                        month = month
                if year == None:
                        year = x.year
                else:
                        year = year
                d1 = datetime.date(year, month,1)
                first_day = d1.isoweekday()
                days_in_month = (d1.replace(month = d1.month %12 + 1,day = 1)-datetime.timedelta(days=1)).day
                bigstr = [0]*(first_day)
                out = ''
                for i in range(1,days_in_month+1):
                        bigstr.append(i)
               
                for i in range(len(bigstr)):
                        if bigstr[i] == 0:
                                bigstr[i] = '  '
                               
               
                for i in range(len(bigstr)):
                        if bigstr[i] < 10:
                                bigstr[i] = '0'+str(bigstr[i])
               
                for i in range(len(bigstr)):
                        if i % 7 == 0 and i !=0:
                                out = out + '\n'
                                out [0:-1]
                        if i == len(bigstr)-1:
                                out = out  + str(bigstr[i])
                        else :
                                out = out  + str(bigstr[i]) + ' '
                             
                out =  '--------------------'+'\n'+'MO TU WE TH FR SA SU'+'\n'+'--------------------'+'\n'+ out
                 
                return out
 
print create_calendar_page(3)
вот как выглядит ответ:
Кликните здесь для просмотра всего текста

--------------------
MO TU WE TH FR SA SU
--------------------

01 02 03 04 05 06 07
08 09 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

А мне надо без пробелов на конце
Кликните здесь для просмотра всего текста
--------------------
MO TU WE TH FR SA SU
--------------------

01 02 03 04 05 06 07
08 09 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31


Вот ссылка на код:
Ответ: Marinero, понятия не имею
Сообщение от mynameanton
убрать пробелы в конце строк
не проблема xD
Вопрос: Scanf считывает enter, как символ конца строки. Как исправить?

Добрый день. Пишу меню для программы в Visual Studio 2015, возникает проблема: scanf запоминает enter, как символ конца строки, и на следующей итерации цикла считывает из потока '\n'.

Пожалуйста, помогите избавиться от этого '\n', не используя cin/cout и другие полезные плюшки Си++. Возможно, я пишу не на тот форум, но по заданию нам надо представить, что мы пишем именно на Си, а не на Си++.

Меню должно выглядеть как-то так
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 <stdio.h>
#include <locale.h>
 
void main()
{
    setlocale(LC_ALL, "Russian");
    char ch = 0;
    int num = 0;
    while (ch != '0')
    {
 
        printf("Меню:\n");
        printf("1. Запустить программу\n");
        printf("0. Выйти из программы\n");
        scanf("%c", &ch);
        switch (ch)
        {
        case '1':
            printf("Введите что-нибудь");
            scanf("%d", &num);
            printf("Вы ввели - %d\n", num);
            break;
        case '0':
            break;
        default:
            printf("Промахнулись :)\n");
            break;
        }
    }
}


Вот что я пробовал делать:
C++
1
2
3
4
5
6
7
void main()
{
...
fflush(stdin); //Не работает, символ '\n' остается в потоке всё равно.
scanf("%c", &ch);
...
}
C++
1
2
3
4
5
6
7
void main()
{
...
scanf("%c%*с", &ch); 
//Отлично работает, но только если scanf в программе всего один
...
}
C++
1
2
3
4
5
6
7
8
void main()
{
...
scanf("%[^\n]c", &ch); 
//Срабатывает, но на повторной итерации не требует ввода,
//затем всегда записывает в переменную пустое значение и зацикливает программу
...
}
Как правильно воспользоваться волшебной строчкой "%[^\n]%*c", которую везде рекомендуют, я не могу понять, из-за неё программа завершается с критической ошибкой.
Ответ: Это отличная мысль, но символ конца строки остается при любом вызове scanf. То есть, когда я запускаю scanf в каком-либо цикле, '\n' снова вылезает при втором вызове. И далеко не всегда нужно считывать символ, состоящий из одного знака.

Просто мне показалось, что это можно как-то решить через поле спецификации формата.

Но за совет спасибо.
Вопрос: Удаление пробелов в конце строк

программа должна удалять пробелы в конце строк, однако выдает ошибку
Program3.pas(12) : Ошибка времени выполнения: Индекс выходит за границы массива
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Program Vvod_Vivod;
var t,f:text;
s:string;
Begin
assign(t,'1.txt');
reset(t);
assign(f,'2.txt');
rewrite(f);
while not eof(t) do
 begin
  readln(t,s);
  while s[length(s)]=' ' do delete(s,length(s),1);
  writeln(f,s);
 end;
close(t);
close(f);
erase(t);
rename(f,'1.txt');
End.
Ответ: ну я вставил этот маленький кусок в свою программу и выдается аналогичная ошибка как на скрине выше.
Если она у вас работает, то я могу оставить так же

Добавлено через 26 минут
Все понял, извините за неудобства. Разобрался изза чего выходит это ошибка-когда в файле есть пустой переход со строки на другую строку, одна строка становится пустой. Как исправить не подскажете?
Вопрос: Удаление всех символов строки s1, встречающихся в s2

Здравствуйте! Пытаюсь решить задание из книги Кернигана и Ричи "Язык программирования Си".
Задание звучит так: "Напишите альтернативную версию ф-ции squeeze(s1,s2), которая бы удаляла из строки s1 все символы, встречающиеся в строке s2". Судя по контексту, речь идёт о массивах (а не о строковых константах)
Вот, что я написал:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Упражнение 2.4. Напишите squeeze(s1,s2), которая бы удаляла из строки s1 все символы, встречающиеся в строке s2.
#include <stdio.h>
#define STR_LIM 75 // макс. длина строки
 
void squeeze(char s1[], char s2[]);
void getline(char arr[], int str_length);
 
int main()
{
    char arr1[STR_LIM], arr2[STR_LIM];
    printf("\n Программа удаляет из строки №1 все символы, содержащиеся в строке №2.\n");
    printf("\n Введите строку№1...\n:>");
    getline(arr1, STR_LIM); // получаем первую строку
    printf("\n Теперь введите строку№2...\n:>");
    getline(arr2, STR_LIM); // получаем вторую строку
//  Подытоживая собранные данные...
    printf("\nВы ввели:%s и захотели удалить из неё символы: %s\n", arr1, arr2);
    squeeze(arr1, arr2); 
//  Вывод результата
    printf("Получилась строка: %s\n", arr1);
 
 return 0;
}
 
//getline(arr[], limit): Получает из входного потока строку недлинее limit и сохраняет её в массиве-аргументе arr[]
void getline(char arr[], int lim)
{
    int x, i;
    i = 0;
    while ((x = getchar()) != '\n' && i < lim-2)
        arr[i++] = x;
    arr[i] = '\0';
}
 
//squeeze(s1,s2): Удаляет из строки s1 все символы. встречающиеся в строке s2.
void squeeze(char s1[], char s2[])
{
  int i, m, n;
    for (i = 0; s2[i] !='\0'; i++) // перебираем нежелательные символы из 2й строки
        for(m = n = 0; s1[m] != '\0'; m++)
            if (s1[m] != s2[i] && s1[m] != '\0')
                s1[n++] = s1[m];
 
    s1[n] = '\0';
 
    
}
Проблема в том, что если ввести во вторую строку более одного символа, то символ конца строки проглатывается, и в результирующем массиве оказываются лишние символы.
Допустим, если ввести в 1ю строку "12345ggggg6789" и во вторую "gg",
то получим "1234567896789".
Никак не могу сообразить, как с этим справиться, не разводя писанину...
Если не трудно - подскажите плз!

p.s.: в задании говорилось про "альтернативную" версию. Так вот, в изначальной версии squeeze имела в качестве второго (удаляемого) аргумента простой символ. Можно сказать, что тело функции почти не изменилось, только обрело 1 лишнуюю переменную и внешний цикл, перебирающий все символы строки s2, которые не должны оставаться в s1. В связи с этим я думаю, что может надо было вообще по-другому подходить к решению?
Ответ: Все будет работать, если функцию squeeze изменить:
C
1
2
3
4
5
6
7
8
9
10
11
void squeeze(char s1[], char s2[])
{
  int i, m, n;
    for (i = 0; s2[i] !='\0'; i++) // перебираем нежелательные символы из 2й строки
    {
        for(m = n = 0; s1[m] != '\0'; m++)
            if (s1[m] != s2[i] && s1[m] != '\0')
                s1[n++] = s1[m];
        s1[n] = '\0';
     }
}