[英]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.