кирилл345, попробуйте так:
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#define CMD_H "-h"
#define CMD_T "-t"
#define CMD_X "-x"
#define CMD_C "-c"
int main(int argc, char* argv[])
{
const char* cmd;
const char* arg;
int a, b;
char oper;
setlocale(LC_ALL, "Russian");
if (argc == 1) {
puts("Лабораторная работа №1 ");
puts("1.При вводе 'h' программа выдаст подробную справку с функционалом программы,если вдруг возникли какие-то проблемы.");
puts("2.При вводе 't' программа выдаст в табличном виде размеры всех простых типов языка C/C++.");
puts("3.При вводе 'x' программа выдаст шестнадцатиричное значение заданного числа. ");
puts("4.При вводе 'c' программа выдаст 3 строки,где нужно ввести 2 числа и арифметическое действие. ");
}
else {
cmd = argv[1];
arg = "";
if (argc >= 2) arg = argv[1];
if ((strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) && argc == 2) {
if (strcmp(cmd, CMD_H) == 0) {
puts("1.При вводе 't' программа выдаст в табличном виде размеры всех простых типов языка C/C++.");
puts("2.При вводе 'x' программа выдаст шестнадцатиричное значение заданного числа. ");
puts("3.При вводе 'c' программа выдаст 3 строки,где нужно ввести первое число-арифметическое действие-второе число. ");
}
}
else if (strcmp(arg, "--table") == 0 || strcmp(arg, "-t") == 0) {
printf("bool:\t\t%i bytes\n", (int)sizeof(bool));
printf("char:\t\t%i bytes\n", (int)sizeof(char));
printf("wchar_t:\t%i bytes\n", (int)sizeof(wchar_t));
/* printf("char16_t:\t%i bytes\n", (int)sizeof(char16_t)); */
/* printf("char32_t:\t%i bytes\n", (int)sizeof(char32_t)); */
printf("short:\t\t%i bytes\n", (int)sizeof(short));
printf("int:\t\t%i bytes\n", (int)sizeof(int));
printf("long:\t\t%i bytes\n", (int)sizeof(long));
printf("long long:\t%i bytes\n", (int)sizeof(long long));
printf("float:\t\t%i bytes\n", (int)sizeof(float));
printf("double:\t\t%i bytes\n", (int)sizeof(double));
printf("long double:\t%i bytes\n", (int)sizeof(long double));
}
else if (strcmp(arg, "--hex") == 0 || strcmp(arg, "-x") == 0) {
printf(" Результат: %x\n", atoi(argv[2]));
}
else if (strcmp(arg, "--calc") == 0 || strcmp(arg, "-c") == 0) {
a = atoi(argv[2]);
b = atoi(argv[4]);
oper = argv[3][0];
if (oper == '+')
printf("Результат сложения: %i\n", a + b);
else if (oper == '-')
printf("Результат вычитания: %i\n", a - b);
else if (oper == '*')
printf("Результат умножения: %i\n", a * b);
else if (oper == '/')
printf("Результат деления: %i\n", a / b);
else if ((oper != '/') && (oper != '*') && (oper != '+') && (oper != '-')) {
puts("Что-то пошло не так... Попробуйте снова. .");
}
}
else {
puts("ОШИБКА! Воспользуйтесь справкой,для этого введите h. ");
}
}
system("pause");
return 0;
}
1. Переменные cmd и arg дублируют друг друга, и там и там argv[1]. Достаточно одной переменной.
2. Для новых компиляторов можно писать printf %zu:
Код:
printf("bool:\t\t%zu bytes\n", sizeof(bool)); /* значение типа size_t */
Актуально для 64-битных платформ, где тип int -- 32-битный, а тип size_t -- 64-битный.
3. sizeof(char) = 1, по определению языка C, это не надо выводить.
4. Насколько я знаю, в языке C нет типов char16_t, char32_t.
5. printf %x выводит беззнаковые числа. Поэтому -1 будет выведено как «ffffffff».
6. У меня не работает умножение. Видимо знак * используется особым образом, и для умножения надо использовать другой знак.