Как поставить две обратные косые черты в C ++ - PullRequest
1 голос
/ 10 марта 2011

Мне нужно создать функцию, которая будет принимать путь к каталогу. Но для того, чтобы компилятор мог прочитать обратную косую черту, мне нужно создать функцию, которая превратит одну обратную косую черту в две обратных косых черты ... пока это мои коды:

string stripPath(string path)
{       
        char newpath[99999];
        //char *pathlong;
        char temp;
        strcpy_s(newpath, path.c_str());
        //pathlong = newpath;
        int arrlength = sizeof(newpath);

            for (int i = 0; i <= arrlength ;i++)
            {
                if(newpath[i] == '\\')
                {
                    newpath[i] +=  '\\';
                    i++;
                }
            }
            path = newpath;
        return path;
} 

этот код получает ввод от пользователя, который является путем к каталогу с одиночной обратной косой чертой. проблема в том, что он дает грязный текстовый вывод;

Ответы [ 5 ]

5 голосов
/ 10 марта 2011

int arrlength = sizeof(newpath); заставляет размер всего вашего массива (в char с) присваиваться arrlength.Это означает, что вы перебираете в массиве более 99999 символов, даже если путь короче (что, вероятно, и есть).

Условие вашего цикла также позволяет пройти за границы массива (начиная с последнего (99999) элемент на самом деле имеет индекс 99998, а не 99999 - массивы начинаются с нуля):

for (int i = 0; newpath[i]] != '\0'; i++)

Кроме того, нет причин сначала копировать строку в массив символов, когда вы можете зацикливаться наstring объект напрямую.

В любом случае, нет необходимости экранировать обратную косую черту от пользовательского ввода .Обратная косая черта - это отдельный символ, как и любой другой;он только особенный, если он встроен в строковые литералы в вашем коде .

2 голосов
/ 10 марта 2011

В этой строке:

if(newpath[i] = '\\')

заменить = на ==.

В этой строке:

newpath[i] +=  '\\';

Это должно добавить \ в строку (я думаю, это то, что вы хотите), но на самом деле это делает некоторую забавную char математику с текущим персонажем. Поэтому вместо вставки символа вы портите данные.

Попробуйте вместо этого:

 #include <iostream>
 #include <string>
 #include <sstream>

int main(int argc, char ** argv) {
  std::string a("hello\\ world");
  std::stringstream ss;

  for (int i = 0; i < a.length(); ++i) {
     if (a[i] == '\\') {
       ss << "\\\\";
     }
     else {
       ss << a[i];
     }
  }

  std::cout << ss.str() << std::endl;
  return 0;
}
1 голос
/ 10 марта 2011

Но для того, чтобы компилятор прочитал Обратная косая черта в мне нужно создать функция, которая сделает один обратная косая черта в 2 обратная косая черта

Компилятор читает строку только при компиляции, и в этом случае вам понадобятся две, поскольку первая обратная косая черта будет escape-символом. Поэтому, если бы в коде была строка статического пути, вам нужно было бы сделать что-то вроде этого:

std::string path = "C:\\SomeFolder\\SomeTextFile.txt";

Компилятор никогда не вызовет вашу функцию, только скомпилирует ее. Поэтому написание такой функции, чтобы компилятор мог читать строку, не решит вашу проблему.

1 голос
/ 10 марта 2011

Условие if (newpath[i] = '\\') должно быть if (newpath[i] == '\\').

Оператор newpath[i] += '\\'; не даст ожидаемого результата объединения. Вместо этого будет добавлено интегральное значение '\\' к newpath[i].

Более того, почему вы используете массив char newpath[99999]; внутри функции. newpath может быть std::string newpath.

int main()
{
  std::string path = "c:\\test\\test2\\test3\\test4";

  std::cout << "orignal path: " << path << std::endl;

  size_t found = 0, next = 0;
  while( (found = path.find('\\', next)) != std::string::npos )
  {
    path.insert(found, "\\");
    next = found+4;
  }

  std::cout << "path with double slash: " << path << std::endl;

  return 0;
}
1 голос
/ 10 марта 2011

много неправильно.не проверял это, но он приблизит вас http://www.cplusplus.com/reference/string/string/

string stripPath(string path)
{       
        string newpath;  
          for (int i = 0; i <= path.length() ;i++)
            {
                if(path.at(i) == '\\')
                {
                   newpath.append(path.at(i));
                   newpath.append(path.at(i));
                }
                else
                   newpath.append(path.at(i));
            }
        return newpath;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...