另一个C问题

时间:2010-04-29 11:51:54

标签: c

我有一段代码如下所示

      #include <stdio.h>
      #include <stdlib.h>
      void Advance_String(char [2],int );
      int Atoi_val;
      int Count_22;
      int Is_Milestone(char [2],int P2);
      char String[2] = "0";
      main()
      {
         while(1)
         {

           if(Is_Milestone(String,21)==1)
           {
                 if(atoi(String)==22)
                 {
                     Count_22 = Count_22 + 1;
                 }
           }
           Atoi_val = atoi(String);
         Advance_String(S,Atoi_val); 
         }
       }
      int Is_Milestone(char P1[2],int P2)
      {
             int BoolInit;
             char *Ptr = P1;

             int value = atoi(Ptr);
             BoolInit = (value > P2);
             return BoolInit;
      }
     void Advance_String(char P1[2],int Value)
     {

             if(Value!=7)
             {
               P1[1] = P1[1]+1;
             }
             else
             {
               P1[1] = '0';
                  P1[0] = P1[0]+1 ;
             }
     }

现在我的问题是Count_22从不递增,因为char增量永远不会达到21或更高的值。有人可以告诉我这种意外行为的原因吗?我的问题是找到Count_22的值。是否有任何问题代码?

谢谢和问候,

麦迪

2 个答案:

答案 0 :(得分:3)

您的代码可能是我见过的最糟糕的C代码之一(没有冒犯,每个人都必须在某个时候学习)。

它有语法错误(可能是复制/粘贴问题),逻辑问题,无意义的混淆,不良实践(全局),缓冲区溢出(在没有存储终止零字节的地方的char上使用的atoi),未初始化的值(Count_22),令人惊讶的命名约定(混合的CamelCase和下划线,以大写字母开头的变量和函数),无限循环,没有标题,我忘了一些。

更多,如果您希望任何人帮助您调试此代码,您应该在列表中说明它应该做什么...

回答原来的问题:为什么Count_22永远不会增加?

因为Is_Milestone总是假的(有或没有@Jay更改)。 Is_Milestone打算似乎是将字符串“22”的十进制值与整数21(或1,布尔结果21 == 1)进行比较,具体取决于版本。)

由于Advance_String行为,这是合乎逻辑的。因为String具有错误的初始值(应该是char String[3] = "00";)并且因为Value!= 7测试。我想你想要的是将数字与7进行比较,但atoi使用完整的字符串。在循环体中实现Atoi_val = atoi(String+1);的另一个小改动。然后你再也看不到因为循环从不停止而且从不打印任何东西。

如果是第一次尝试某位老师给出的练习(例如“编写基础7中的两位数计数器”或类似的话)。您应该考虑不使用atoi并使用以下内容将字符数字转换为值:

digit_value = char_value - '0';

示例:

char seven_as_char = '7';
int seven_as_int = seven_as_char - '0';

如果你能解释一下你真正想做的事情,我们可能会向你展示一些简单的示例代码,而不是你想要调试的恐怖。

修改

使用原始代码真的更简单......

在阅读了Ada源代码后,我可以确认它确实是一个基于Ascii的八进制计数器。原始代码质量很差,这解释了生成的C代码质量差的部分原因。

一个可能的直接端口可能如下(但仍然需要一个严重的清理看起来像本机C代码......并且因为它打印一个常量而且非常愚蠢):

#include <stdio.h>
#include <stdlib.h>

void Advance_String(char * P1)
{
     if((P1[1]-'0') != 7){
         P1[1]++;
     }
     else{
         P1[1] = '0';
         P1[0]++ ;
     }
}


int Is_Milestone(char * P1, int P2)
{
    return (atoi(P1) > P2);
}

main()
{
    int Count_11 = 0;
    int Count_22 = 0;
    int Count_33 = 0;
    int Count_44 = 0;
    char S[3] = "00";

    int cont = 1;

    while(cont)
    {
        if(Is_Milestone(S, 10)){
            if(atoi(S) == 11){
                Count_11 = Count_11 + 1;
            }
            if(Is_Milestone(S, 21)){
                if(atoi(S) == 22){
                    Count_22 = Count_22 + 1;
                }
                if(Is_Milestone(S, 32)){
                    if(atoi(S) == 33){
                        Count_33 = Count_33 + 1;
                    }
                    if(Is_Milestone(S, 43)){
                        if(atoi(S) == 44){
                            Count_44 = Count_44 + 1;
                        }
                        if (atoi(S) == 77){
                            cont = 0;
                        }
                    }
                }
            }
        }
        Advance_String(S);
    }
    printf("result = %d\n", Count_11 + Count_22 + Count_33 + Count_44);
}

答案 1 :(得分:2)

本声明

if(Is_Milestone(S,21==1) // Braces are not matching. If statement is not having the closing brace. Compilation error should be given.

应该是

if(Is_Milestone(S,21)==1)

我想。

此外,您发布的代码似乎不正确。它肯定会给出编译错误。您已声明Count22,但正在使用Count_22

请检查。