【问题标题】:Varaiable does not update after For LoopFor 循环后变量不更新
【发布时间】:2021-02-28 02:55:04
【问题描述】:

这里我写了一个简单的加密函数。
这个变量不知何故以一个意外的值开始,在 For 循环之后保持不变。

代码如下:

int sim_encrypt( char* PreEncMsg , int spaces) {
    
    int MsgLen = strlen(PreEncMsg);
    int PostEncMsg = 0;
    
    for (int iter1 = 0; iter1 < 3; iter1++) {
        for (int iter2 = 0; iter2 < MsgLen; iter2++) {  //Get every 4 character in the string
            if (iter2 % spaces == 0) {
                printf("[PROCCESS|%d] = %d\n", iter1 + 1 ,PreEncMsg[iter2]);
                int PostEncMsg = PostEncMsg + PreEncMsg[iter2];
                printf("Encrypted code = [%d]\n" , PostEncMsg);
            }
        }
        memmove(PreEncMsg, PreEncMsg+1, MsgLen);  //Removes the first chracter of the string
    }
    printf("Final result = [%d]\n" , PostEncMsg);
    return PostEncMsg;
}

以下是输出

[PROCCESS|1] = 72
Encrypted code = [21931]
.
.
.
[PROCCESS|3] = 116
Encrypted code = [23293]
[PROCCESS|3] = 0
Encrypted code = [23293]
Final Result = [0]

如您所见,“PostEncMsg”最初被指定为“0”,但不知何故以“21858”开头。
在最终结果中,变量不知何故为“0”。

【问题讨论】:

  • 代码中其他地方可能存在未定义行为,请提供A Minimal, Complete, and Verifiable Example (MCVE)
  • memmove(PreEncMsg, PreEncMsg+1, MsgLen); 这看起来很危险。它尝试从PreEncMsg+1 开始读取MsgLen 字符,但这似乎可能超出PreEncMsg 缓冲区的末尾。
  • @kaylum,乍一看我也有同样的想法,但缓冲区最后包含空字符,它被 memmove 拾取并在字符串字符向左移动时有效地拖动终止符.
  • 因此,循环最终将处理零字节值。我怀疑对于正确的操作,您真的想在遍历这些循环时跟踪终端空字节的位置,以便您可以在正确的点终止。每次调用memmove,减少MsgLen。一次一个错误。
  • 那么我应该用更安全的东西替换memmove还是以某种方式减少MsgLen

标签: c string for-loop


【解决方案1】:

循环内PostEncMsg变量的定义

int PostEncMsg = PostEncMsg + PreEncMsg[iter2];

eclipse函数开头的那个

int PostEncMsg = 0;

所以基本上你在每次循环迭代中定义一个新变量,这就是为什么外部变量(“最终结果”)不更新的原因。您在内部 printfs 中看到的奇怪成员取决于您从未初始化内部变量这一事实(因此它的初始值为 undefined)。

我没有深入分析你的函数应该做什么,但你可能只需要以这种方式更新循环内的PostEncMsg变量

PostEncMsg = PostEncMsg + PreEncMsg[iter2];

【讨论】:

  • 在我删除了 int 声明后,程序提供了预期的结果。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多