C에서 시저 암호 프로그램을 수행하고 있습니다. 이미 프로그램을 실행했지만 실행 중에 오류가 발생하는 경우가 있습니다.malloc 및 realloc에서 오류 받기
코드 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main() {
int size=10,al=0;
int sizek=10,ak=0;
char *str= (char *) malloc(size+5);
if (str == NULL) {
printf("malloc error\n");
return 0;
}
char *strIni=str;
char *str2= (char *) malloc(sizek+5);
if (str2 == NULL) {
printf("malloc error\n");
return 0;
}
char *str2Ini=str2;
//char a,b;
while ((str[al]=getchar())!='\n') {
if (al==size-2){
size=size+10;
char *strR=(char *) realloc(str,size);
if (strR == NULL) {
printf("malloc error\n");
return 0;
}
printf("DDDD\n");
strIni=strR;
}
al++;
}
printf("Or1 %d Al %d\n",strlen(strIni),al);
str[al]='\0';
printf("Af %d Al %d\n",strlen(strIni),al);
while ((str2[ak]=getchar())!='\n') {
if (ak==sizek-2){
sizek=sizek+10;
char *str2R=(char *) realloc(str2,sizek+5);
if (str2R == NULL) {
printf("malloc error\n");
return 0;
}
printf("CCCC\n");
str=str2R;
}
ak++;
}
printf("Or2 %d Ak %d\n",strlen(str2Ini),ak);
str2[ak]='\0';
printf("Af2 %d Ak %d\n",strlen(str2Ini),ak);
printf("Str1 %s\n",strIni);
printf("Str2 %s\n",str2Ini);
int sDup=1;
int dif[strlen(str2Ini)];
int* dup=(int *) malloc(sizek);
int max[(sDup)];
int rot[2]={0,0};
for (int i=0;i<(strlen(str2Ini));i++){ //pokud AA - aa -xy)
if (str2Ini[i]<123&&str2Ini[i]>96 &&strIni[i]<91&&strIni[i]>64){
dif[i]=(int)str2Ini[i]-((int)strIni[i]+6);
} else if (strIni[i]<123&&strIni[i]>96 &&str2Ini[i]<91&&str2Ini[i]>64){
dif[i]=(int)strIni[i]-((int)str2Ini[i]+6);
} else if (strIni[i]<123&&strIni[i]>96 &&str2Ini[i]<123&&str2Ini[i]>96) {
dif[i]=(int)strIni[i]-((int)str2Ini[i]);
} else if (strIni[i]<91&&strIni[i]>64 &&str2Ini[i]<91&&str2Ini[i]>64){
dif[i]=(int)strIni[i]-((int)str2Ini[i]);
}
if (dif[i]<0) {
dif[i]=-1*dif[i];
}
printf("Dif%d: %d\n",i,dif[i]);
}
for (int i=0;i<strlen(strIni);i++) {
int l=0;
for (int j=0;j<sDup;j++) {
if (dif[i]==dup[j]) {
max[j]++;
l++;
break;
}
}
if (l==0){
dup[sDup-1]=dif[i];
max[sDup-1]=0;
max[sDup-1]+=1;
sDup++;
}
}
for (int h=0;h<1;h++){
for (int i=0;i<(sDup-1);i++) {
if(rot[0]>max[i]) {
rot[0]=rot[0];
} else {
rot[0]=max[i];
rot[1]=dup[i];
}
}
}
for (int i=0;i<strlen(strIni);i++){
if (((int)strIni[i]>64 && (int)strIni[i]<91) || ((int)strIni[i]>96 && (int)strIni[i]<123)){
continue;
} else {
fprintf(stderr, "Error: Chybny vstup!\n");/*free(strIni);free(str2Ini);free(dup); */return 100;
}
}
for (int i=0;i<strlen(strIni);i++){
if (((int)strIni[i]>64 && (int)strIni[i]<91) || ((int)strIni[i]>96 && (int)strIni[i]<123)){
if (strlen(strIni)==(strlen(str2Ini))) {
if ((int)strIni[i]+(int)rot[1]>90 && (int)strIni[i]<91) {
strIni[i]=strIni[i]+6+(int)rot[1];
} else if ((int)strIni[i]+(int)rot[1]>122 && (int)strIni[i]<123) {
strIni[i]=(strIni[i]-58+rot[1]);
} else if ((int)strIni[i]>64 && ((int)strIni[i]+rot[1])<91) {
strIni[i]=strIni[i]+rot[1];
} else if ((int)strIni[i]>96 && ((int)strIni[i]+rot[1])<123) {
strIni[i]=strIni[i]+rot[1];
} else {
strIni[i]='#';
}
//printf("%c ",strIni[i]);
} else {fprintf(stderr, "SSError: Chybna delka vstupu!\n");/*free(strIni);free(str2Ini);free(dup);*/ return 101;
}
} else {
fprintf(stderr, "Error: Chybny vstup!\n");/*free(strIni);free(str2Ini);free(dup);*/ return 100;
}
}
str[al]='\0';
printf("Rot: %d\n",rot[1]);
printf("String: %s\n",strIni);
// free(strIni);free(str2Ini);free(dup);
//freeIni, dup
///posun o 42pismen
return 0;
}
I 주석 그것은 또한 나에게 오류를 제공했기 때문에 할당 된 공간을 확보. 나는 나중에 그것을 다루기를 원했다.
모든 printfs는 마지막 코드를 사용하여이 코드가 무엇을하는지, 어디에서 멈출 지 알 수 있습니다.
Sipmly 코드 : getchar를 사용하여 str과 str2에 2 문자열을 얻습니다. (Var al과 ak는 보통 i의 insted입니다.) 그런 다음 (size (10) -2)보다 크면 size + 10을 재 할당합니다. 그런 다음 문자열로 작업하고 문자 사이의 차이를 만듭니다. 그런 다음 가장 많이 사용 된 차이를 찾아 최종 회전으로 사용합니다. 그 후 계산 된 회전으로 첫 번째 문자열을 회전합니다.
입력 :
qrstuvwxyzABCDEFGHIJKLMNnop
aHcQefghWjdlmnopqostuvTxyYZ
출력 :
DDDD
DDDD
Or1 19 Al 27
Af 19 Al 27
오류 :
prog: malloc.c:2842: mremap_chunk: Assertion `((size + offset) & (_rtld_global_ro._dl_pagesize - 1)) == 0' failed.
Excpected 출력 :
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS
어떤 * 줄의 오류 코드를 참조합니까? 스택 추적을 확인해야합니다. –
할당 된 메모리 범위를 벗어나면 일반적으로 오류가 발생합니다. 에러를 찾으려면 [Valgrind] (http://valgrind.org/)와 같은 메모리 디버거로 시간을 좀 벌어보십시오. –
그런데'getchar'가'EOF'를 반환하면 어떻게 될까요? –