2015-01-11 2 views
3

Эта проблема, которую я чувствую, более я понимаю указателей, но здесь идет. Я предполагаю создать системную программу в C, которая выполняет вычисления как таковой математический оператор value1 value2. Пример math + 1 2. Это создаст 3 на экране. У меня возникают проблемы с сравнением или суммированием чисел. Вот то, что я до сих пор:Справка по базовому программированию

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

int main(int ac, char* args[]) 
{ 
    int total; 
    if (strcmp(*++args,"+") == 0) 
    { 

    } 
    printf("Total= ", value1); 
    if (strcmp(*args,"x") == 0) 
     printf("multiply"); 
    if (strcmp(*args,"%") == 0) 
     printf("modulus"); 
    if (strcmp(*args,"/") == 0) 
     printf("divide"); 
    return 0; 
} 

я могу сделать строку сравнения, чтобы получить оператор, но я с трудом, добавив два значения. Я пробовал:

int value1=atoi(*++args); 

Любая помощь была бы оценена.

+2

Я голосовал за этот вопрос должен быть переведен в SO (так как это больше о программировании, чем * Никс. Тем не менее, Я могу сказать вам, что этот код может использовать некоторую серьезную нежную любовь и заботу (пожалуйста, используйте фигурные скобки для всех условных утверждений (читайте: gotofail), похоже, что инструкция 'switch' может помочь, отступы - ваш друг). ! – HalosGhost

+0

Если я ошибаюсь, нет никакого вреда при опускании брекетов, когда оператор if имеет только одну строку. Как вы можете видеть, я использовал фигурные скобки для первого, если я использовал более 1 строки при тестировании. Также отсутствуют отступы из-за вставки его и использования четырех пространств для отображения в качестве кода. – shayster01

+1

Вот, позвольте мне исправить отступы для вас. Но вы должны * всегда * использовать фигурные скобки для любого блока. В C, технически, вам не нужно, если это одна строка, но читайте на Gotofail от Apple, если вы считаете, что это никогда не причиняло вреда. – HalosGhost

ответ

1
*++args 

Поскольку вы делаете Преинкремент ++ оператор имеет более высокий приоритет, чем * поэтому указатель увеличивается, а затем вы разыменования его тогда вы никогда не могли бы получить доступ к arguement, которые вы на самом деле намерены.

Если у вас есть вход как

+ 1 2

Мы

args[1] = + 

args[2] = 1 

args[3] = 2; 

Почему нельзя просто получить доступ к atoi(args[2])

Вы можете сделать что-то вроде

int main(int argc, char **args) 
{ 
    if(argc != 4) 
    { 
     printf("Fewer number of arguements\n"); 
     return 0; 
    } 

    else if((strcmp(args[1],"+")) == 0) 
    { 
     printf("Sum = %d\n",atoi(args[2]) + atoi(args[3])); 
    } 

    return 0; 
} 
+0

Я пока не могу предложить изменения на этом сайте, но противоречивое отступы меня так задевают! Устранить это, пожалуйста? : D – HalosGhost

+0

Работал отлично, и ваше объяснение помогло мне понять, что я делаю неправильно. – shayster01

+0

@Gopi: Это [предлагаемое редактирование] (http://stackoverflow.com/review/spected-edits/6712148) было просто отклонено. Я изначально, хотя я сделал ошибку, но теперь я думаю, что нет. Неясно, относятся ли индексы к 'args' ** до ** или ** после ** приращения. Кроме того, я понятия не имею, что означает «Почему нельзя просто получить доступ ...». Ваш ответ выиграет от некоторых разъяснений. –

1

Вместо доступа к командной строке args через указатели, вы можете сделать это с помощью ссылки на массив. Например, "math + 1 2", арг [0] является math, арг [1] будет + и т.д.

int main(int ac, char* args[]) 
{ 
    if(ac < 4) 
    { 
     printf("Invalid Argument"); 
     return 0; 
    } 
    if (strcmp(args[1],"+") == 0) 
    { 
     int x = atoi(args[2]); 
     int y = atoi(args[3]); 
     printf("%d + %d = %d\n", x,y, x + y); 
    } 
    if (strcmp(args[1],"x") == 0) 
    { 
     int x = atoi(args[2]); 
     int y = atoi(args[3]); 
     printf("%d * %d = %d\n", x,y, x * y); 
    } 
    if (strcmp(args[1],"%") == 0) 
    { 
     int x = atoi(args[2]); 
     int y = atoi(args[3]); 
     if(y == 0) 
      return 0; 

     printf("%d %% %d = %d\n", x,y, x % y); 
    } 
    if (strcmp(args[1],"/") == 0) 
    { 
     int x = atoi(args[2]); 
     int y = atoi(args[3]); 

     if(y == 0) 
      return 0; 
     printf("%d/%d = %d\n", x,y, x/y); 
    } 
    return 0; 
} 
+0

Спасибо за ваше объяснение, работал как шарм. – shayster01

Смежные вопросы