我应该制作一个函数来反转字符串中的单词。一切看起来都很好,但调试器显示SIGSEGV
#include <stdio.h>
void removeChar(char *str, char garbage) {
char *src, *dst;
for (src = dst = str; *src != ' '; src++) {
*dst = *src;
if (*dst != garbage) dst++;
}
*dst = ' ';
}
void reverse(char* begin, char* end)
{
char temp;
while(begin<end){
temp=*begin;
*begin++=*end;
*end--=temp;
}
}
char* swap_order_words(char* str)
{
char* txt;
if(!str && !txt)
{
return NULL;
}
if(str != NULL)
{
txt = str;
}
if(*txt == ' ')
{
return NULL;
}
if(txt=NULL){
return NULL;
}
int k=0, lit=0;
while(*(txt+k)!=' ')
{
if(*(txt+k)>=65 && *(txt+k)<=90){
lit++;
}
if(*(txt+k)>=97 && *(txt+k)<=122){
lit++;
}
if(!(*(txt+k)>=65 && *(txt+k)<=90) && !(*(txt+k)>=97 && *(txt+k)<=122) && !(*(txt+k)==32)){
removeChar(txt,*(txt+k));
}
k++;
}
if(lit<1){
return NULL;
}
char* start=txt;
char* stop=txt;
while(*stop){
stop++;
if(*stop==' '){
reverse(start,stop-1);
}
else if(*stop==' '){
reverse(start,stop-1);
start=stop+1;
}
}
reverse(txt,stop-1);
return txt;
}
int main ()
{
char str[1001];
char str_z_nothing_to_show[]={"Nothing to show"};
printf("Podaj tekst: ");
fflush(stdout);
scanf("%1000[^n]", str);
char * ver;
ver = swap_order_words(str);
if(ver==NULL){
printf("%s", swap_order_words(str_z_nothing_to_show));
return 0;
}
printf ("%s",ver);
return 0;
}
语句if(txt=NULL)
不是比较,它实际上是将txt
设置为空指针。比较将是==
。
因此,当k
为零时,*(txt+k)
将是一个空指针解引用,这是导致SIGSEGV的一个非常好的候选者。
请记住,即使您修复了,在首次使用txt
之前,您也从未将其设置为特定值,因此它包含的内容将是一些任意值,这意味着行为也是任意的。