我有家庭作业:使用第一个函数编写一个使字符串反向的函数,然后编写使字符串中的单词反向的函数。因此,如果输入为:“有美好的一天”,则输出为:“有美好的一天”。我不明白为什么我的代码无法正常工作-我一直遇到分段错误。第一个功能(反向)工作正常。问题出在第二个。我真的需要你的帮助...预先谢谢你。
#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;
}
恐怕这里有很多事情要注意。
首先,获取段错误的原因是您在使用令牌之前从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的工具(如果尚未使用)。遇到类似情况时,它将为您提供大量帮助。
保重。
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;
}