Основная проблема с вашим внутренним циклом заключается в том, что p
нельзя использовать одновременно как цель завершения (p + substringLength
) и
в качестве счетчика. Это как сказать for (int i = 0; i < i + 10; i++)
. i
когда-нибудь достигнет i + 10
?
Вы можете попробовать установить p + substringLength
в переменную len
, а затем использовать эту фиксированную стойку ворот в качестве условия завершения цикла.
Во-вторых, используйте toupper()
для преобразования символов. В противном случае пробелы и неалфавитные символы также будут изменены, что приведет к неожиданному поведению. Например, пробелы будут превращены в нулевые завершающие символы, лишающие сироты конца строки.
Если сложить все вместе, получится:
for (char *len = p + substringLength; p < len; p++)
{
*p = toupper(*p);
}
Наконец, puts(p);
не работает так, как вы ожидаете. К концу функции p
использовался для перебора строки и теперь указывает на конец строки, а не на начало. Используйте puts(str);
или просто печатайте из области вызова, чтобы избежать побочных эффектов .
Вот полный пример:
#include <ctype.h>
#include <stdio.h>
#include <string.h>
void replaceSubstring(char *str, char *substr) {
char *p = str;
int substringLength = strlen(substr);
while (*p)
{
if (strncmp(p, substr, substringLength) == 0)
{
for (char *len = p + substringLength; p < len; p++)
{
*p = toupper(*p);
}
}
p++;
}
}
int main(void) {
char s[12] = "hello world";
replaceSubstring(s, "llo wor");
printf("%s\n", s);
replaceSubstring(s, "ll");
printf("%s\n", s);
replaceSubstring(s, "h");
printf("%s\n", s);
replaceSubstring(s, "hello worldz");
printf("%s\n", s);
char t[28] = "i don't know how to do this";
replaceSubstring(t, "do");
printf("%s\n", t);
replaceSubstring(t, "'t know");
printf("%s\n", t);
return 0;
}
Выход:
heLLO WORld
heLLO WORld
HeLLO WORld
HeLLO WORld
i DOn't know how to DO this
i DOn'T KNOW how to DO this
Попробуйте!