C:有时会出现分段错误?
问题描述:
你好伙计Stackoverflowers!C:有时会出现分段错误?
为什么下面的代码有时会抛出Segmentation错误(即1/10次)?
控制台:
输入字符串
赛车
分段故障
#include <stdio.h>
#include <string.h>
int main()
{
char string_buffer[21];
int i, length;
int flag = 0;
print f("Input a string\n");
scanf("%20s", string_buffer);
length = strlen(string_buffer);
for(i=0; i < length; i++) {
if(string_buffer[i] != string_buffer[length-i-1]) {
flag = 1;
break;
}
}
if(flag) {
printf("%sNot a Palindrome.\n");
}
else {
printf("%sPalindrome.\n");
}
return 0;
}
答
你printf()
陈述期望char *
指针,你是不是传递一个。这会调用未定义的行为。
更改此
if(flag) {
printf("%sNot a Palindrome.\n");
}
else {
printf("%sPalindrome.\n");
}
到
if (flag == 1)
printf("`%s' IS NOT a Palindrome.\n", string_buffer);
else
printf("`%s' IS a Palindrome.\n", string_buffer);
如果启用编译器警告你应该警告这一点。
这是您的代码的改进版本与上述固定
#include <stdio.h>
#include <string.h>
int main()
{
char string_buffer[21];
int flag = 0;
int length;
if (scanf("%20s%n", string_buffer, &length) != 1)
return -1;
for (int i = 0 ; ((flag == 0) && (i < length)) ; ++i)
flag = (string_buffer[i] != string_buffer[length - i - 1]);
if (flag == 1)
printf("`%s' IS NOT a Palindrome.\n", string_buffer);
else
printf("`%s' IS a Palindrome.\n", string_buffer);
return 0;
}
这不会解决这个问题,但使用'的scanf(“%20S%N”,string_buffer,&长度)描述下的问题;'而不是'strlen的()'。 –
很有可能是因为它调用了未定义的行为10/10次... – Olaf
我会建议你使用fgets或getline而不是scanf,因为你遇到这个问题的方式是因为iharob指出的最后两个printf –