2015-10-19 3 views
1
#include <iostream> 
#include <string> 
#include <cctype> 
using namespace std; 

int main() { 
string passCode; 

passCode = "1 "; 
int i; 

for(i =0; i < passCode.length();i++){ 
if(isspace(passCode.at(i)) == true){ 

passCode.replace(i,1,"_"); 

} 

} 
cout << passCode << endl; 
return 0; 
} 

Код выше, мои указания - [Заменить любое пространство '' на '_' в 2-символьной строке passCode. Если места не существует, программа ничего не должна печатать.]Как правильно заменить символ в строке C++?

с моим кодом в настоящее время так, как он есть, он выводит «1». Когда я запускаю его с условием проверки false, а не true, он печатает «_». Я не понимаю, почему это делается, кто-нибудь видит проблему, которой я не занимаюсь? Мне не разрешено использовать алгоритм. заголовок. Мне также разрешено работать только внутри основного, никаких функций или импортированных заголовков/классов.

ответ

0

Как описано here, isspace не возвращает bool. Вместо этого он возвращает int, где отличное от нуля значение представляет true, а значение нуля - false. Вы должны выписать чек, как это:

if (isspace(passCode.at(i)) != 0) 
+0

я вижу, это то, как он объяснил мне: верно, если пробельные isspace (' ') // истинно isspace (' \ п ') // истинно isspace (' х') // ложному нет интересно, что это не сработало. thanks alot – Flower

+2

@Flower В контексте того, как if/while и другие условные операторы работают в C/C++, это значения, отличные от нуля, считаются TRUE, а значения, равные нулю, - FALSE. Итак, технически вы могли бы даже написать свой, если бы так: if (isspace (passCode.at (i))). –

+0

Обратите внимание, что это сделает больше, чем «Заменить любое пространство' '' '". – juanchopanza

4

Для отдельных символов, может быть проще использовать алгоритм std::replace:

std::replace(passCode.begin(), passCode.end(), ' ', '_'); 

Если вы не можете использовать заголовок алгоритма вы можете свернуть свою собственную replace функцию. Это может быть сделано с помощью простого цикла:

template<typename Iterator, typename T> 
void replace(Iterator begin, Iterator end, const T& old_val, const T& new_val) 
{ 
    for (; begin != end; ++begin) 
     if (*begin == old_val) *begin = new_val; 
} 
+1

Я думаю, что '' replace_if' + isspace' может быть установлен здесь лучше. Он также используется в коде OP. – Downvoter

+2

@cad Инструкции говорят: «Замените любое пространство» на «_», поэтому использование 'isspace' будет делать больше, чем это. – juanchopanza

+0

Это не работает, он говорит, что replace не является членом std :: – Flower

1

с моим кодом в настоящее время так, как это, он выдает «1». Когда я запустить его с проверкой условие ложно, а не так, он печатает «_»

isspace возвращает ненулевое значение, когда оно передается пространство. Это не обязательно должно быть точно 1. С другой стороны, логическое значение true обычно равно 1.

Когда мы сравниваем возвращаемое значение isspace с true, что происходит, когда они не совсем равны? В частности, что, если true - 1, а isspace возвращает только некоторое ненулевое значение?

Я думаю, что это то, что здесь происходит. Условие if не работает, потому что эти два являются разными значениями. Поэтому пространство не заменяется на «_».

+0

Да, в моей программе он оценивал какое-то положительное значение, спасибо за помощь. – Flower

1

Ваша проблема использования вами isspace. Если вы читали the documentation for isspace он говорит:

Возвращаемое значение
значение, отличное от нуля (т.е. истинно), если на самом деле с представляет собой белый символ пробела. Ноль (т. Е. False) в противном случае.

Тем не менее, вы проверяете, возвращает ли он true или false. Ваш компилятор должен предупредить вас о несоответствии, поскольку isspace возвращает int, и вы проверяете bool.

Переход к следующему коду должен работать для вас:

if(isspace(passCode.at(i)) != 0) { 
    passCode.replace(i,1,"_"); 
} 

Мой ответ основан более конкретно вокруг вашего вопроса и вашего комментария сказать, что вы не можете использовать любые заголовки, кроме того, что вы включили.Лучшим решением было answered by juanchopanza, и вы должны пожрать, чтобы использовать стандартную библиотеку всякий раз, когда можете, а не писать свой собственный код.

1

Вы также можете сделать это с помощью цикла while, управляемого std::string::find, и заменить пробелы на std::string::replace.

std::string test = "this is a test string with spaces "; 
std::size_t pos = 0; 
while ((pos = test.find(' ', pos)) != std::string::npos) 
{ 
    test.replace(pos, 1, "_"); 
    pos++; 
} 
std::cout << test; 

Live Example

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