【发布时间】:2014-02-12 00:26:48
【问题描述】:
我最大的问题在这一行:
for(i=0;i
函数第 7 行 decifrar: 即使使用用于清除内存的 memset 也能保持循环(它甚至比字符串长度还要大)
注意如果我在该行中使用字符串的实际长度,则代码确实有效(即,将 strlen(enc) 替换为 60 )
void decipher(int k, char *enc){
char alfa[]="9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA";
char *pch;
int i;
for(i=0;i<=strlen(enc);i++){
pch=strchr(alfa, enc[i]);
if (pch) enc[i] = *(pch + k),enc[i]=tolower(enc[i]);
}
printf("%s",enc);
}
int main(){
int keys[6]={1,4,15,24,12,20},i;
char *txt="rfgr r hz grkgb fvzcyrf dhr cergraqr fre grfgnqb ab cebtenzn";
char *txttemp=malloc(sizeof(char)*1024);
for(i=0;i<6;i++){
printf("\n\n\t Attempt number: %d\n\n",i+1);
memset(txttemp,'\0',sizeof(char)*strlen(txt)+30);
memcpy(txttemp, txt, strlen(txt));
decipher(keys[i],txttemp);
}
return 0;
}
我错过了什么? strlen 的用法有误吗?
【问题讨论】:
-
你不应该在 for 条件中使用像
strlen()这样的函数。每次循环都会对其进行评估。a[strlen(a)]处的字符是空字符。你真的要处理吗? -
而且,因为每次循环都会对其进行评估,并且您正在覆盖终止的
'\0',这就是为什么您的for循环“没有停止”,因为当您删除该@ 987654326@您的“字符串长度”可能会突然变得巨大。另外,顺便说一句,不要使用sizeof(char),因为它总是1。