要求: 不能使用库函数。 只能开辟有限个空间(空间个数和字符串的长度无关)。
首先限制不能用库函数,所以要先写出一个strlen()的函数;
然后就是读清楚题目,思路过程为"student a am i"------>“i ma a tneduts”------->“i am a student”
所以这里就需要先逆置整个字符串,然后再把每个单词逆置;
具体完成结果如下:
int my_strlen(const char *str) {//求字符串长度
assert(str);
int len = 0;
while (*str++) {
len++;
}
return len;
}
void reverse(char *left, char *right) {//逆置字符串
assert(left);
assert(right);
while (left < right) {
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void str_reverse(char *str) {//逆置每一个单词
assert(str);
int len = my_strlen(str);//求长度
reverse(str, str + len - 1);//整体逆置
while (*str != '\0') {
char *p = str;
while ((*str != ' ') && (*str != '\0')) {//每个单词结束标记为一个空格,最后一个单词是'\0'
str++;//依次累计每个单词的字符
}
reverse(p, str - 1);//单词分别逆置
if (*str != '\0') {//表示遇到'\0'则字符串停止累加
str++;
}
}
}
int main() {
char str[] = "student a am i";
str_reverse(str);
printf("%s\n", str);
system("pause");
return 0;
}