2016-05-10 2 views
0

Вот метод, который заменяет все пробелы в строке «% 20». Он отлично работает в целом, но жалуется, когда выполнение заканчивается с «Ошибка проверки времени выполнения № 2 - S». Есть ли проблема с моей петлей for?Ошибка проверки времени выполнения # 2 - S, Visual Studio C++

void replaceSpace(char *s) { 
    int spaces = 0; 
    for (int i = 0; i < strlen(s); i++) { 
     if (s[i] == ' ') { 
      spaces++; 
     } 
    } 

    // new string that includes overwriting space, and two additional chars 
    int newLen = strlen(s) + spaces * 2; 

    s[newLen] = '\0'; 
    for (int i = strlen(s) - 1; i >= 0; i--) { 
     if (s[i] == ' ') { 
      s[newLen - 1] = '0'; 
      s[newLen - 2] = '2'; 
      s[newLen - 3] = '%'; 
      newLen -= 3; 
     } 
     else { 
      s[newLen - 1] = s[i]; 
      --newLen; 
     } 
    } 
} 




char test[] = "rep lace Spac e"; 
replaceSpace(test); 
cout << test << endl; //rep%20lace%20Spac%20e 

редактировать: Я побежал это через cpp shell и не было никаких проблем, как ни странно. Я попробую обновить визуальную студию 2015 и отчитаться.

изменить2: Нет, такая же ошибка.

+0

* Кажется, что работа является одной из возможностей неопределенного поведения. –

ответ

1

При определении test

char test[] = "rep lace Spac e"; 

вы определяете массив ровно 16 символов (не забудьте строку терминатор). Невозможно расширить массив, то есть вы выберете границы массива, что приведет к неопределенным поведением.

Решение, конечно же, должно использовать std::string, а append.

+0

Нет ли там другого пути? Реализация в java, казалось, не имела проблемы. Я могу, конечно, просто использовать std :: replace, но я практикую реализацию. – blueman

+1

@mannerofallthings Массивы имеют фиксированный размер, вот и все. Если вы хотите расширить строку (например, заменить один символ на три), вам потребуется какая-то динамическая структура данных, например, стандартный класс 'std :: string'. –

0

Действительно, этот код не требуется. Проверьте это:

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <cctype> 

int main() 
{ 
    std::string s("rep lace Spac e"); 
    s.erase(std::remove_if(s.begin(), s.end(), static_cast<int(*)(int)>(std::isspace)), s.end()); 
    std::cout << s; 
} 
+0

Нуждается в объяснении того, как и почему это работает, иначе вы просто продвигаете [Cargo Cult programming] (https://en.wikipedia.org/wiki/Cargo_cult_programming) – user4581301

+0

OP хочет, чтобы все пробелы заменялись на «% 20», а не просто удалялись. –

Смежные вопросы