我需要一个程序来反转字符串中的单词。
输入:我的车很快 输出:快是车我的
int printRword(char * line) {
for(; *line; line++) {
if(*line == ' ') {
printRword(line + 1);
printf("%s", line);
return 0; // after you find the space set it to null
}
}
}
int main(void) {
char *line = "this is a long line that we are working with\n";
printf("%s", line);
printRword(line);
return 0;
}
我知道在找到空间后我需要将空间设置为null,并且我尝试过printRword(line + 1)='\ 0'; 这不起作用 有什么建议吗?
答案 0 :(得分:1)
您可以反转整个字符串,然后反转每个单词,具有反转单词顺序的效果,但保留每个单词中的字母的顺序正确。也许不是最有效的,但概念上很干净 - 而且不依赖于语言!
答案 1 :(得分:0)
您可以逐个字符地检查字符串,用ASCII NUL字符替换空格( C 的字符串终结符),并记录下一个位置每种情况(通过推入堆栈),从而记录每个单词的开头。当你到达字符串的末尾时,你可以向后浏览“单词开头”位置列表(可能是通过弹出堆栈),每次打印出单词后跟一个空格。
这是基本的想法。如果你必须处理单词或换行符之间的多个空格,它会变得有点复杂,但并不多。
答案 2 :(得分:0)
找到修改后的工作代码:
int printRword(char * line)
{
char tempbuf[100]; //Here length i have hardcoded to 100
char *ptr;
strcpy(tempbuf,line); //copied to tempbuf to keep the original string unmodified
//Replace the \n with the null character
ptr = strrchr(tempbuf,'\n');
if(ptr != NULL)
{
*ptr = '\0';
}
while(*tempbuf != '\0')
{
ptr = strrchr(tempbuf,' ');
if(NULL != ptr)
{
*ptr = '\0';
ptr++;
printf("%s ",ptr);
}
else
{
printf("%s\n",tempbuf);
*tempbuf ='\0';
}
}
}
测试结果:
atharv @ atharv-Inspiron-5423:〜/编程$ ./a.out
这是我们正在使用的一条长线
有了工作,我们就行了这个
atharv @ atharv-灵-5423:〜/编程$
答案 3 :(得分:0)
我使用相同的递归方法修改你的代码以获得所需的输出,只是添加了一个只能打印到下一个空格的函数..必须有一个函数,但我不知道它。
#include <stdio.h>
void printTillNextSpace(char *s){
while(*s != ' ' && *s != '\0' && *s != '\n')
printf("%c",*s++);
printf("%c",' ');
}
int printRword(char * line){
char* start = line;
for(;*line; line++){
if(*line == ' '){
printRword(line + 1);
printTillNextSpace(start);
start = line + 1;
return 0; // after you find the space set it to null
}
}
printTillNextSpace(start);
}
int main(){
char * line = "this is a long line that we are working with\n";
printf("%s", line);
printRword(line);
return 0;
}