这是作业的一部分。
基本上,应该有“这些不是回文!”或“这些是回文!”出来了,但是每当我运行它并输入字符(尽管它编译得很好)时,它总是给我一个错误:堆栈缓冲区溢出。我想知道是否是
even_count
函数内的循环问题。
This frame has 1 object(s):
[32, 62) 'pali_array' (line 30) <== Memory access at offset 95 overflows this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
(longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-overflow /home/Execise in C/3.10.c:92 in even_count
原来的问题是: 编写一个程序,提示用户输入一个短语并判断它是否是回文。并且不要使用任何内置字符串处理函数,如 strlen() 和 strcmp()。
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
int Check_Pali(char pali_array[30],int count);
void lower_conversion(char pali_array[30],int count);
int odd_count(char pali_array[30],int middle);
int even_count(char pali_array[30],int middle);
int main(void){
char c;
int flag;
int count=0;
char pali_array[30];
int i;
while((c=getchar()!='\n')){
for(i=0;i<30;i++){
//fill the array with getchar.
pali_array[i]=c;
count++;
if(ispunct(pali_array[i])||isspace(pali_array[i])){
i--;
count--;
}
//putchar(pali_array[i]);
}
}
flag=Check_Pali(pali_array,count);
if(flag==1){
printf("These are not Palindromes!\n");
}
else{
printf("These are Palindromes!\n");
}
}
int Check_Pali(char pali_array[30],int count){
int middle;
int flag;
//Set all the letters to lower case.
if(count%2==0){
middle=(count)/2;
flag=even_count(pali_array,middle);
return flag;
}else{
middle=count/2;
flag=odd_count(pali_array,middle);
return flag;
}
}
//Turn all the char into lower case.
void lower_conversion(char pali_array[30],int count){
int i;
for(i=0;i<count;i++){
pali_array[i] = tolower(pali_array[i]);
}
}
//when middle is an odd number.
int odd_count(char pali_array[30],int middle){
int i;
int flag=0;
for(i=1;i<=middle;i++){
if(pali_array[middle-i]!=pali_array[middle+i]){
flag=1;
}
}
return flag;
}
//when middle is an even number.
int even_count(char pali_array[30],int middle){
int i;
int j=1;
int flag=0;
for(i=0;i<middle;i++){
if((pali_array[middle+i])!=pali_array[middle-j+1]){
flag=1;
}
j++;
}
return flag;
}
程序编译正确,但是当我输入任何单词后,它就得到了
error:stack-buffer-overflow.
我使用的编译器是gcc,标志是:
cc -Wall -Wextra -Wfloat-equal -pedantic -Wvla -std=c99 -g3 -fsanitize=address -fsanitize=undefined
添加
printf("count:%d\n", count);
到 Check_Pali()
的开头显示,对于每个字母,计数都会增加 30。
所以我的猜测是,因为您将 for 循环放入 while 语句中,所以回文单词中的每个字母您的计数都会增加 30。
然后您尝试访问 paly_array[]
中比预期大的部分。