c中的字符串中的单词反向

问题描述 投票:0回答:2

我有家庭作业:使用第一个函数编写一个使字符串反向的函数,然后编写使字符串中的单词反向的函数。因此,如果输入为:“有美好的一天”,则输出为:“有美好的一天”。我不明白为什么我的代码无法正常工作-我一直遇到分段错误。第一个功能(反向)工作正常。问题出在第二个。我真的需要你的帮助...预先谢谢你。

#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;
}
c string reverse
2个回答
0
投票

恐怕这里有很多事情要注意。

首先,获取段错误的原因是您在使用令牌之前从strtok更改了令牌,因此一旦调用strcat,令牌最终将为NULL。修复后,代码的该部分应如下所示:

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

您仍然会注意到程序无法正常运行。基本上,因为您输入的内容“过得愉快”,所以您想要输出的结果将是“过得很愉快”,但您却得到了“ yad”(请注意,您的打印内容可能会令人困惑,因为在reverseAll内使用printf而不使用换行符)字符不能使输出清晰...)。快速浏览代码即可发现错误。以下是工作代码和一些解释,您可能应该阅读这些解释,因为到最后,这些都很重要:)

    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);
        token=strtok(NULL," ");
        while(token != NULL)
        {
            strcat(new," ");
            reverse(token);
            strcat(new, token);
            token = strtok(NULL, " ");
        }
        strcpy(a,new);
        free(new);
    }

发生的事情是,您正在对命名为“ new”的字符串进行所有更改,但实际上,您要打印的内容以及要有效更改的是已命名为a的字符串。除此之外,您还存在内存泄漏,但是目前这并不重要。我在代码中保留了您命名为“ new”的字符串,以防您稍后要使用它进行某些操作,但是您可以对其进行不同的编程,从而甚至不需要此变量。此外,您永远不会在新字符串中引入任何空格。基本上,strtok会给您单词“ day”,“ nice”等,但其中没有空格。因此,如果不考虑这一点,您的最终字符串将看起来像“ dayniceahave”,而不是“ day nice a have”。

最后但并非最不重要:我认为,如果您有时间再考虑一次,您将自己解决其中的大部分问题。 segfault可能是您最严重的问题,如果您有空余时间,应该检查一个名为valgrind memcheck的工具(如果尚未使用)。遇到类似情况时,它将为您提供大量帮助。

保重。


0
投票

reverse()应该在a为null时正常工作。并且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);
  //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;                                                                    
}
© www.soinside.com 2019 - 2024. All rights reserved.