下面是我的代码,我不明白为什么它总是给我分段错误:
#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);
}
在我看来,我已经做好了一切,错误是什么?
答案 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;
}