【问题标题】:reset variable in for loop of c code在c代码的for循环中重置变量
【发布时间】:2014-08-26 21:01:55
【问题描述】:

我正在尝试编写一些 C 代码来增加 IP 地址。我希望其中一个变量“j”在达到 256 后重置回 0,因为每个八位字节只有 255 个 IP 地址。我的问题是我似乎无法将“j”设置回 0。任何想法我做错了什么?

int main()
{

    int breakCount = 300;

    int j = 0;
    int x = 0;

    for(int i = 0; i < breakCount; i++) 
    {
        printf("class-map type traffic match-all cm%d\n",i);
        printf("match source-address ipv4 100.%d.%d.0\n",x,j);

        j++;

        if (j == 256)
        {
            x++;

            int j = 0;
        }
    }

    return 0;
}

/* 代码片段输出 */

match source-address ipv4 100.0.253.0
class-map type traffic match-all cm254
match source-address ipv4 100.0.254.0

class-map type traffic match-all cm255
match source-address ipv4 100.0.255.0

class-map type traffic match-all cm256
match source-address ipv4 100.1.256.0

class-map type traffic match-all cm257
match source-address ipv4 100.1.257.0

【问题讨论】:

    标签: c pointers for-loop


    【解决方案1】:

    从您重置它的int j = 0; 中删除int(在循环中),因为现在您创建了一个局部变量,而不是使用之前声明的变量。

    【讨论】:

    • 大声笑...伙计,我是如此接近。谢谢你们的帮助。我刚开始尝试学习 C。您的建议有效。
    【解决方案2】:

    您是否尝试将零分配给 j ?

    if (j == 256)
    {
        x++;
    
        j = 0;
    }
    

    【讨论】:

    • 谢谢 这是我修复代码所需要的。非常感谢。
    【解决方案3】:

    看起来您正在递增单个八位字节。最好先将点分 IPv4 字符串转换为单个 32 位 unsigned int 然后递增。

    【讨论】:

    • 不知道为什么有人会反对这个。为什么您不以与计算机相同的方式处理 IPv4 地址?您的网络协议不关心单个八位字节。 IPv4 地址被视为 32 位无符号整数。你应该这样处理它们。除此之外,由于您不必担心单个八位字节,因此递增会容易得多。
    【解决方案4】:

    另一种重置变量的方法是:

    j = j %256;
    if (j == 0) {
       x++
    }
    

    【讨论】:

      【解决方案5】:

      /* 一些像重置 vars printf 这样的功能可能正在这样做。您应该制作一个数组而不是打印它。 */ int main() {

      int breakCount = 300;
      int j = 0;
      int x = 0;
      int list_[breakCount][2];
      
      for(int i = 0; i < breakCount; i++) {
      
          list_[i][0] = x;
          list_[i][1] = j;
      
          j++;
      
          if (j == 256)
          {
              x++;
      
              int j = 0;
          }
      }
      
      for (int i = 0; i < breakCount; i++) {
          printf("class-map type traffic match-all cm%d\n", i);
          printf("match source-address ipv4 100.%d.%d.0\n", list_[i][0], list_[i][1]);
      }
      
      return 0;
      

      }

      【讨论】:

      • 这类似于标记为接受的答案。但是,这将不起作用,因为 int j=0; 在内部创建了一个新变量 j,如果条件完全不会影响外部变量。
      【解决方案6】:

      提示:您可以尝试将其分为两个循环:

      for(int i = 0; i < 256; i++) 
      

      和

      for(int i = 256; i < 300; i++) 
      

      在这两种情况下,都将 j 初始化为 0。

      【讨论】:

      • 这会降低代码的可读性,因为当正确的答案是在重置 j 时远程访问 int 时,它看起来像您需要两个不同的循环跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多