Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Как экранировать \ (http://forum.oszone.net/showthread.php?t=328933)

NikiWin 07-08-2017 15:12 2756916

Как экранировать \
 
Добрый день. Попросили прикрутить утилиту. На вход она просит текст, при этом внутри она ищет \r\n и по ним разбивает строку на подстроки. Проблема в том что когда я ввожу в консоль текст с \r\n, она почему то его автоматически экранируются слешем(\\r\\n), в следствии чего программе не может получить подстроки. Кавычки одинарные и двойные не помогают, если сам экранирую и прямым и обратным слешем тоже не помогает. Подскажите пожалуйста как победить win консоль?

Iska 07-08-2017 15:46 2756925

Цитата:

Цитата NikiWin
Попросили прикрутить утилиту. »

Где её взять? Приведите ссылку.

Цитата:

Цитата NikiWin
Проблема в том что когда я ввожу в консоль текст с \r\n, »

Покажите Ваш код. Продемонстрируйте, как вводите.

NikiWin, причём тут консоль? \r\n — это C.

NikiWin 07-08-2017 16:00 2756929

К сожалению утилиту не могу выложить. Запускаю ее из консоли командой: C:\MyProg\prog.exe param1\r\nparam2. Загвоздка в том, что к строке vector <string> vM = split<string>(var[1], "\r\n") переменная var[1] имеет значение уже param1\\r\\nparam2. Изменить программу я не могу. Можно как-то запретить cmd менять \ на \\?

Iska 07-08-2017 16:30 2756943

NikiWin, ещё раз: интерпретатор команд тут не при чём. Он ничего здесь не меняет. Можете взять Process Explorer и посмотреть, что приходит на вход утилите. Можете взять Process Monitor и убедиться и с его помощью.

Я не пойму: у Вас есть её исходный код? Откуда это:
Цитата:

Цитата NikiWin
к строке vector <string> vM = split<string>(var[1], "\r\n") переменная var[1] »

На чём она написана?

NikiWin 07-08-2017 16:45 2756948

У меня есть ее исходный код, но я не могу ее менять. Написана она на С. Если посмотреть через Process Explorer то действительно, в командной строке везде по одному слешу выдает, но если сразу в main вывести argv то получим C:\\MyProg\\prog.exe в argv[0] и param1\\r\\nparam2 в argv[1].

mwz 07-08-2017 16:59 2756952

Цитата:

Цитата NikiWin
в командной строке везде по одному слешу выдает »

Дурацкий вопрос... А если вообще без слэшей ввести?

NikiWin 07-08-2017 17:03 2756953

Вложений: 1
Если без слешей, то ничего не добавится, будет просто текст. Привел скрин простейшей программы и значение переменных под отладчиком.

Iska 07-08-2017 20:17 2756991

Цитата:

Цитата NikiWin
Написана она на С. »

На приведённом скриншоте вовсе не C.

Цитата:

Цитата mwz
А если вообще без слэшей ввести? »

Так и останется «rn».


NikiWin, вопрос упирается в конкретный язык и конкретный компилятор.

Скрытый текст
Код:

#include <stdio.h>

int main (int argc, char *argv[]) {
        int count;

        if (argc > 1) {
                for (count = 1; count < argc; count++) {
                        printf("argv[%d] = %s\n", count, argv[count]);
                }
        } else {
                printf("The command had no other arguments.\n");
        }

        return 0;
}



NikiWin 08-08-2017 09:04 2757062

Используется Visual с++. Я проверил у меня тоже корректно выводит из приложения данные(с одним слешем), но именно в программе отладчик показывает два слеша и судя по работе split переменные внутри программы содержат два слеша.

Iska 08-08-2017 09:25 2757063

Цитата:

Цитата NikiWin
но именно в программе отладчик показывает два слеша »

Вы пробовали посмотреть в отладчике именно argv[1], а не значение других переменных после присвоения? Я-то точно не буду загружать и устанавливать VC++ только из-за этого. Могу только сказать, что на шарпе (благо компилятор от него идёт в комплекте с .Net) этого также не происходит:
Скрытый текст
Код:

class CommandLine {
        static void Main(string[] args) {
                System.Console.WriteLine("parameter count = {0}", args.Length);

                for (int i = 0; i < args.Length; i++) {
                        System.Console.WriteLine("Arg[{0}] = [{1}]", i, args[i]);
                }
        }
}



Время: 09:15.

Время: 09:15.
© OSzone.net 2001-