在反转弦时发生分段故障

时间:2015-06-16 12:49:04

标签: c segmentation-fault

下面是我的代码,我不明白为什么它总是给我分段错误:

#include <stdio.h>
void reverse(void);

int main ()
{
    printf("enter the text");
    printf("\n");
    reverse(); 

    printf("\n");
    return(0);
} 
void reverse(void)
{
    char c;
    if((c=getchar()) != '\n')
    {
        reverse();
    }
    putchar(c);
}

在我看来,我已经做好了一切,错误是什么?

3 个答案:

答案 0 :(得分:4)

只要输入换行符,代码就可以正常工作。也许你用EOF终止你的输入(通常绑定到Ctrl + D)而不给它添加换行符,在这种情况下,代码永远不会看到换行符,并且由于无限递归而会出现堆栈溢出

因此,您应该检查getchar()是否返回EOF。另外,getchar()会返回int,而不是char - 这对于可移植性非常重要,并确保与EOF的比较按预期工作。

解决这些问题之后的代码:

#include <stdio.h>

void reverse(void);

int main (void) {
    printf("enter the text\n");
    reverse(); 
    printf("\n");
    return 0;
}

void reverse(void) {
    int c;
    if ((c=getchar()) != '\n' && c != EOF) {
        reverse();
    }
    if (c != EOF) {
        putchar(c);
    }
}

答案 1 :(得分:0)

您的程序编译并在我的设置上正常运行:Ubuntu 14.04.2 LTS 64位上的最新稳定gcc。

这是使用不同方法的另一个版本(即fgets函数)。看看它是否适合你:

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

void reverse_str( char * );

int main()
{
    char input[1024];

        printf("Enter text: ");
        fgets(input, sizeof(input), stdin);

        reverse_str(input);

        printf("Reversed string: %s\n", input);

    return 0;
}

void reverse_str(char *to_reverse)
{
    char temp[1024];
    int count = strlen(to_reverse) - 1; //Exclude newline introduced with fgets
    int i=0;

        for( i=count; i>=0; i-- ){
            temp[i] = to_reverse[count - i - 1]; //Subtract 1 to not include the new line introduced by fgets
        }

        temp[count+1] = '\0';
        strcpy(to_reverse, temp);
}

答案 2 :(得分:0)

你的代码似乎失败了,因为getchar()的讨厌的字符..在大多数系统中它应该工作,但我认为你的编译器正试图访问超出数组和保存的内存。因此产生分段错误...你能否确定你是否给出了&#39; \ 0&#39;代替&#39; \ n&#39;,它是否有效......我认为问题是您的机器无法检测到&#39; \ n&#39;从你的键盘和键盘给出因此继续进入递归模式&amp;在递归结束之前堆栈溢出&amp;当堆栈溢出时,它正试图访问未经授权的内存和因此发生分段错误

试试这个

#include <stdio.h>
#include <string.h>
char str[] = "Hello World";
size_t length;
int count = 0;

void reverse(char* a, char* b){
//  static int count = 0;
  char temp;
  if (count < length/2){
    count++;
    reverse(str + count, str + (length - 1) - count);
  }
    temp = *a;
    *a = *b;
    *b = temp;
}
int main(){
length = strlen(str);
reverse(str, str + length - 1);
printf("%s", str);
return 0;
}