c - 反转c中字符串中的单词

标签 c string reverse

我有作业:编写一个反转字符串的函数,然后使用第一个函数编写一个反转字符串中单词的函数。因此,如果输入是:“有美好的一天”,输出将是:“美好的一天”。 我无法理解为什么我的代码不起作用 - 我不断遇到段错误。 第一个功能(反向)工作得很好。问题出在第二个。 我真的需要你的帮助... 预先感谢您。

#include <stdio.h>
#include <string.h> 
#include <stdlib.h> 

void reverse(char *a)
{
   int i, j, size;
   char tmp;

  size = strlen(a);
  j=size-1;

  for(i=0; i<size/2; i++)
  {
      tmp=a[i];
      a[i]=a[j];
      a[j]=tmp;
      j--;
  }

}


void reverseAll(char *a)
{
   int size;

   reverse(a);

   size = strlen(a);
   char *new = (char*)malloc(size+1);

  char *token = strtok(a, " ");
  reverse(token);
  strcpy(new, token);
  printf("%s ", new);
  while(token != NULL)
  {
      reverse(token);
      token = strtok(NULL, " ");
      strcat(new, token);
  }

}

int main()
{
   char a[15]= "have a nice day";

    reverseAll(a);
    printf("%s ", a);
    return 0;
}

最佳答案

当 a 为 null 时,

reverse() 应该可以正常工作。 reverse(token) 应该在 token = strtok(NULL, ""); 之后。 以下代码工作正常。

#include <stdio.h>                                                                                                                                                                                                
#include <string.h>                                                                 
#include <stdlib.h>                                                                 

void reverse(char *a)                                                               
{                                                                                   
   int i, j, size;                                                                  
   char tmp;                                                                        

   if(!a)                                                                           
       return;                                                                      
  size = strlen(a);                                                                 
  j=size-1;                                                                         

  for(i=0; i<size/2; i++)                                                           
  {                                                                                 
      tmp=a[i];                                                                     
      a[i]=a[j];                                                                    
      a[j]=tmp;                                                                     
      j--;                                                                          
  }                                                                                 

}                                                                                   


void reverseAll(char *a)                                                            
{                                                                                   
   int size;                                                                        

   reverse(a);                                                                      

   size = strlen(a);                                                                
   char *new = (char*)malloc(size+1);                                               

  char *token = strtok(a, " ");                                                     
  reverse(token);                                                                   
  strcpy(new, token);                                                               
  //printf("%s ", new);                                                                                                                         
  while(token != NULL)                                                              
  {                                                                                 
      token = strtok(NULL, " ");                                                    
      reverse(token);                                                               
      if(token){                                                                    
        strcat(new, " ");                                                           
        strcat(new, token);                                                         
      }                                                                          
  }                                                                              

  strcpy(a, new);                                                                
  free(new);                                                                     

}                                                                                

int main()                                                                       
{                                                                                
   char a[15]= "have a nice day";                                                

    reverseAll(a);                                                               
    printf("%s ", a);                                                            
    return 0;                                                                    
}

关于c - 反转c中字符串中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59204364/

相关文章:

algorithm - 反转双向链表的子列表

javascript - 如何仅反转字符串中特定长度的单词(JS)?

c - 如何删除C中的文本?

c - 简单的c程序无法在linux中编译,出现奇怪的错误

PicKit3 和 MPlabX(IDE 和 IPE)的连接失败错误

c - 如何使用 rsyslogd 登录到/var/log/mail.log?

php - 在 PHP 中检查字符串长度

Python 从另一个列表创建特定列表

java - java中获取状态码的正则表达式是什么?

C:非 ASCII 文本数据的 char 与 unsigned char