编程题目:
给定一个字符串“I love china”,编写程序完成以单词为单位的逆序,如“china love i”,并要求不允许使用第三方变量保存数据,但可以使用辅助指针变量等。
思路及程序编写
思路一
首先将字符串整体倒置:“anihc evol i”
然后再次遍历字符串,将每个单词倒置:“china love i”
程序如下:
#include <stdio.h>
void swapstr(char *head ,char *tail);
int main(int argc, const char *argv[])
{
char str[] = "I love china";
char *head = str, *tail = str;
puts(str);
//先将尾指针定位到字符串尾部
while(*tail != '\0')
tail ++;
//将整个字符串倒置
swapstr(str, tail - 1);
//主函数开始扫描遍历整个倒置后的字符串
while(*head != '\0')
{
//查找单词头
while(*head == 32) //32是空格
head++;
//找到头后将尾定位到头,开始找单词尾
tail = head;
while(*tail != 32 && *tail != '\0')
tail++;
//前两步找到头之后将单词倒置(因为循环结束后tail指向'\0',所以tail-1)
swapstr(head,tail - 1);
//单词倒置后将头指向尾,为下次找单词做准备
head = tail;
}
puts(str);
return 0;
}
//完成指定字符串倒置
void swapstr(char *head, char *tail)
{
char temp = 0;
while(head < tail)
{
temp = *head;
*head = *tail;
*tail = temp;
head++;
tail--;
}
}
思路二
(这种思路是为了引出strtok函数和指针数组结合用法,可能不满足题目要求,但结果一致。)
首先使用strtok函数进行字符串分割(strtok函数用法可以百度)
然后定义一个指针数组,把分割后的字符串逐个存入指针数组(指针数组概念必须知道)
然后将这个指针数组内的多个字符串用strcat函数进行逆序连接
程序如下:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char str[] = "i love china";
char *p_arr[3] = {NULL,NULL,NULL};
char arr[100] = {0};
char *p = NULL;
int i = 0;
p = strtok(str," ");//获取第一个字符串
while(p != NULL) //继续获取其他字符串 直至检测不到字符串返回空指针
{
printf("%s ",p); //打印信息,用于调试
p_arr[i] = p; //将获取到的字符串存入指针数组
i++;
p = strtok(NULL," "); //获取下一个字符串
}
putchar('\n');
for(i = 0;i < 3;i++)
{
printf("%s ",p_arr[i]); //打印调试信息
}
putchar('\n');
for(i = 2; i >= 0;i--) //倒序
{
printf("%s ",p_arr[i]); //打印调试信息
strcat(arr,p_arr[i]); //3个字符串倒着连接
strcat(arr," ");
}
putchar('\n');
puts(arr); //输出结果
return 0;
}