For循环不会在strlen上停止

Man*_*eli 2 c string for-loop

我最大的问题是这一行:

for(i = 0; i <= strlen(enc); i ++) - >

函数decifrar的第7行: 它使用memset来保持循环,用于清除内存(它甚至比字符串长度还要大)

请注意,如果我使用该行中字符串的实际长度,代码确实有效(即用60替换strlen(enc))

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;
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么意思?strlen的用法是错误的吗?

Men*_*ene 7

<不在<=for循环中.

但作为注意:避免这种模式.Strlen意味着你计算字符串的长度,但你可能应该已经从某个地方知道它(即当你收到它时:文件长度,返回的字符数等等).保存并将该值作为长度.这是程序中许多安全漏洞的来源(缓冲区溢出).

std::string 有这个作为一个内置的功能,这是我几乎所有的时间推荐的简单char*(即如果你可以使用C++)

  • 问题是关于C; `std :: string`不存在. (4认同)
  • 至少将它提升到循环之外.`int n = strlen(enc); for(i = 0; i <n; i ++)...` (3认同)