簡體   English   中英

反轉字符串時發生分段錯誤

[英]segmentation fault occur while reversing the string

下面是我的代碼,我不明白為什么它總是給我分段錯誤:

#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);
}

我認為我已正確完成所有操作,這是什么錯誤?

只要輸入換行符,代碼就可以正常工作。 也許您正在使用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);
    }
}

您的程序已編譯並在我的設置上運行良好: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);
}

由於getchar()的令人討厭的字符,您的代碼似乎失敗了。在大多數系統中,它應該可以工作,但我認為您的編譯器正在嘗試訪問數組之外​​保存的內存,從而產生分段錯誤。確保是否用'\\ 0'代替'\\ n',它是否正常工作。我認為問題是您的計算機無法檢測到鍵盤上的'\\ n',因此請繼續進入遞歸模式,並且在遞歸結束之前堆棧已溢出;當堆棧溢出時,它試圖訪問未授權的內存,因此發生分段錯誤

嘗試這個

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM