Еще один вопрос C - PullRequest
       15

Еще один вопрос C

1 голос
/ 29 апреля 2010

У меня есть код, показанный ниже

      #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 никогда не увеличивается, поскольку приращения символов никогда не достигают значения 21 или выше. Кто-нибудь может сообщить мне причину этого неожиданного поведения? Мой вопрос здесь заключается в том, чтобы найти значение Count_22. код?

Спасибо и всего наилучшего,

Мэдди

Ответы [ 2 ]

3 голосов
/ 29 апреля 2010

Ваш код, вероятно, является одним из худших кусков кода C, который я когда-либо видел (без обид, каждый должен когда-нибудь учиться).

Имеются синтаксические ошибки (возможно, проблема с копированием / вставкой), логические проблемы, бессмысленное запутывание, неправильные методы (глобальные переменные), переполнение буфера (atoi используется на символе, где нет места для хранения завершающего нулевого байта), неинициализированные значения (Count_22), удивительное соглашение об именах (смешанные CamelCase и подчеркивание, переменные и функции, начинающиеся с заглавной буквы), бесконечный цикл, без заголовка, и я забыл некоторые.

Более того, если вы хотите, чтобы кто-нибудь помог вам отладить этот код, вы должны в списке сказать, что он должен делать ...

Чтобы ответить на оригинальный вопрос: почему Count_22 никогда не увеличивается?

Потому что Is_Milestone всегда false (с изменением @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';

Если вы можете объяснить, что вы на самом деле пытаетесь сделать, мы можем показать вам простой пример кода вместо ужаса, который вы пытаетесь отладить.

EDIT

Это действительно проще с оригинальным кодом ...

После прочтения источника 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);
}
2 голосов
/ 29 апреля 2010

Это утверждение

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.

Пожалуйста, проверьте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...