Не могли бы вы сообщить мне, какую ошибку я здесь совершаю?
В дополнение к @ dbush хорошему ответу, код OP неоправданно неэффективен.
Используя приведенный ниже исправленный код, и предположим, что начальная длина str, sChar
равна S,C
соответственно.
for(i = 0; i < strlen(str); i++) {
for(j = 0; j < strlen(sChar); j++) {
if(str[i] == sChar[j]) {
str[i] = rChar;
}
}
}
for(i = 0; i < strlen(str); i++) {
, а с последующим str[i] = rChar;
обязывает код:найдите длину от str
до S раз, и каждый strlen(str)
требует O (S) операций.
Если бы S
было нетривиальным значением, скажем 1000, это 1000 * 1000 могло бы легко повлиять на общую производительность.Простым решением является вычисление длины один раз или поиск нулевого символа .
// for(i = 0; i < strlen(str); i++) {
S = strlen(str);
for(i = 0; i < S; i++) {
// or
for(i = 0; str[i]; i++) {
То же самое происходит и с внутренним циклом.Тем не менее, умный компилятор может видеть, что sChar
не меняется, и может использовать преимущество понимания, что strlen()
не имеет побочных эффектов, которые могли бы привести к другому результату.При такой оптимизации strlen(sChar)
действительно можно вызвать один раз, даже если strlen(sChar)
внутри более высокого цикла for (i...)
.
Тем не менее просто и идиоматично просто проверить нулевой символ .
// for(j = 0; j < strlen(sChar); j++)
// better as
for(j = 0; sChar[j]; j++)
Но почему это не относится к циклу for(i = 0; i < strlen(str); i++)
?
В этом цикле код может изменять str[]
, поэтому компилятор не может сделатьоптимизация как при for(j = 0; sChar[j]; j++)
.
. Здесь также возникает вопрос: что должен делать код, если заменяющий символ rChar
является нулевым ?
На мой взгляд, код можно продолжить, заменив его '\0
несколько раз, или просто вернуть после этого.
str[i] = rChar;
if (rChar == '\0') return; // Possible way to handle \0