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