【问题标题】:For loop doesn't stop on the strlenFor 循环不会在 strlen 上停止
【发布时间】: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

标签: c string for-loop


【解决方案1】:

for 循环中的 &lt; 不是 &lt;=

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

std::string 将此作为内置功能,我几乎一直都建议使用普通的 char*(如果您可以使用 C++)

【讨论】:

  • 至少将它从循环中提升出来。 int n = strlen(enc); for( i = 0; i &lt; n; i++)...
  • 问题是关于C的; std::string 不存在。
  • 是的,但是这是一个典型的初学者错误,所以我添加了它并说它只能在C++中使用,因为我认为它不是不可能,使用C++是可行的,作者只是说C ;D
  • 它是否“可行”并不重要——你不会通过建议作者使用 C++ 来回答 Python 或 Awk 问题,同样应该适用于 C 问题。
  • 如果有人说 C,意思是 C++,传统的反应是纠正他们并重新标记问题。在这种特殊情况下,发布的代码不会编译为 C++。
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多