有一个字符数组的内容为:”student a am i”,请你将数组的内容改为”i am a student“
分析:
思路是这样的,可以先将每个单词逆置,以空格为分界。
再将整个字符串全部逆置。
这里使用数组和指针两种操作,指针更为方便一些。
程序1:
void Reverse_string(char *s,int left,int right)
{
while (left < right)
{
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "student a am i";
printf("The string is:%s\n",arr);
int i = 0;
int left = 0, right = 0;
int strl = strlen(arr)-1;
Reverse_string(arr, 0, strl);
printf("Reverse the whole string:%s\n", arr);
while (i<=strl)
{
if (arr[i] != ' ')
{
left = i;
while (arr[i]&&arr[i] != ' ')
{
i++;
}
right = i - 1;
}
char tmp = 0;
while (left <= right)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
i++;
}
printf("The result is :%s\n", arr);
system("pause");
return 0;
这里用了数组解决。
首先先将第一个空格之前的字符串逆置,然后找到下一个空格继续重复。
程序2:
void reverse_string(char arr[])
{
char *p = arr;
char *q = p;//pq指向同一
while (*p)
{
if (isspace(*p))
{
reverse(q, p - 1);//逆置单个单词
p++;
q = p;
}
else
{
p++;
}
}
reverse(q, p - 1);//逆置最后一个字符串
reverse(arr, p - 1);//整体逆置字符串
}
static int reverse(char *start, char *end)
{
while (start < end)
{
char tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
int main()
{
char arr[] = "student a am i";
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
reverse_string(arr);
printf("%s", arr);
system("pause");
return 0;
}
这里简单分析指针做法。
设置两个指针,均指向第一个字符。p指针用来寻找空格。
该字符不是空格,后移。
该字符是空格,交换第一个字符和p指向的前一个字符(p此时指向空格),q前移,p后移,交换。重复该过程。直到p和q交叉。
此时第一个单词逆置。
p继续前移寻找下一个空格,而q紧跟p,此时重复上述步骤,可以交换第二个字符串。
如何逆置单个字符串?