尽可能不开辟新数组空间
主要思想是,计算出需要的足够空间,从后往前改变
//计算需要的足够空间,从后往前改变
void replace_space(char* str) {
char* p = str;
char* p_start = str;
char* p_end = str;
int space_num = 0;
int size = 0;
while (*p_end) {
if (*p_end == ' ') {
space_num++;
}
p_end++;
}
size = strlen(str) + space_num * 2;//一个字符变成3个字符
p = str + size ;//p指向预留空间后,最后的字符处,不要-1,要为\0留出位置
while (p_start < p_end) {
if (*p_end == ' ') {
*p = '0';
*(p - 1) = '2';
*(p - 2) = '%';
p = p - 3;
}
else {
*p = *p_end;
p--;
}
p_end--;
}
puts(str);
}
int main() {
char str[100];
//scanf("%s", str);//scanf %s接受不了空格
char* find;
fgets(str, 100, stdin);
if (find = strchr(str, '\n')) {//特殊处理一下fgets吞下的回车,有点烦人
*find = '\0';
}
replace_space(str);
system("pause");
return 0;
}
最开始的p_end是从\0开始的,也正是如才能正常输出。