2015-10-07 1 views
-1

Итак, я несколько недель в университете, и у меня есть отношения любви и ненависти с C прямо сейчас. Я люблю язык, но некоторые его части просто разъяряют меня до конца.Как проверить ввод на C без stdlib.h?

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

Однако для этого конкретного упражнения наша система маркировки отклоняет любую программу, которая включает stdlib, что означает, что использование чего-то типа atoi или atof не является вариантом. Мой профессор упомянул что-то об использовании scanf, чтобы сначала проанализировать аргументы как строку, а затем преобразовать ее в целое число, но, честно говоря, это немного за меня.

+5

Добро пожаловать в Stack Overflow! Прямо сейчас ваш вопрос возникает, когда вы просто запрашиваете ответ на свои домашние проблемы, а это не то, что происходит с переполнением стека. Я бы посоветовал сделать немного исследований самостоятельно (есть бесконечные источники информации) и попытаться понять это. Если вы столкнетесь с определенной проблемой, которая сделает [хороший вопрос] (http://stackoverflow.com/help/how-to-ask), не стесняйтесь спрашивать здесь еще раз. – jaredk

+0

О, не волнуйся, это было не первое, к чему я прибегал. Я потратил немало времени, пытаясь разобраться в проблеме по одиночке, тогда я обратился к своим учебникам и моему профессору, но никто не был особенно полезен. – Absoguar

ответ

0

использование sscanf().
Ваш главный должен выглядеть так.

int main(int argc, char *argv[]) 
{ 
    int numCount, x, y; 
    numCount = sscanf(argv[1], "%d", &x) + sscanf(argv[2], "%d", &y); 

    if(numCount != 2){ 
     printf("[-] One of the arguments is not a valid number.\n"); 
     return 0;} 

    if(x == 0 || y == 0){ 
     printf("[-] one of the numbers is zero.\n"); 
     return 0;} 

    printf("[+] The arguments are valid numbers.\n"); 
} 

sscanf сканирует буфер по вашему выбору. В этом случае у вас есть два аргумента, что означает, что у вас есть два буфера. Формат, который вы хотите для каждого буфера, это «% d», потому что вы ожидаете, что каждый буфер будет числом. sscanf возвращает количество успешных «чтений». Если буфер не будет содержать допустимого числа, возвращаемое значение каждого sscanf будет равно 0, поэтому мы ожидаем, что numCount будет равен 2.

+0

Пожалуйста, не давайте ответы на домашние проблемы, прежде чем студент сможет узнать что-то от них. – Davislor

+0

лично, мне нравится учиться на фрагментах кода. Во всяком случае, отныне я избегаю раздавать домашние задания. – hyprnir

+0

Не волнуйся, Лорейн, я не собираюсь просто копировать это. Я на самом деле пытаюсь понять код здесь и переписать его. Единственная проблема заключается в том, что попытка разделить любое из чисел на другое вызывает необработанное исключение, которое не имеет для меня никакого смысла. – Absoguar

0

Если ваш профессор позволяет использовать sscanf(3) и другие функции от <stdio.h>, вам просто нужно прочитать их документацию и использовать их. Но я предполагаю, что для этого упражнения он этого не хочет.

Вам необходимо будет повторно реализовать свой собственный эквивалент atoi, но назовите его my_atoi, чтобы избежать путаницы. Это неважно. Вы могли бы рассмотреть возможность создания своего рода strtol(3), который управляет конечным указателем.

Кстати, вы можете даже найти некоторые free software реализации некоторого C standard library (например musl-libc ....) и изучить их исходный код, но ваш учитель может считать, что быть обман, если вы не говорите ему.

Однако, решив это упражнение, я рекомендую вам прочитать код бесплатного программного обеспечения (и не стесняйтесь рассказывать своему учителю), потому что он чрезвычайно поучителен и намного ближе к вашей реальной работе как разработчик программного обеспечения позже (в вашей первой работе вы вряд ли начнете проект программного обеспечения ex-nihilo).