Атои в отчаянии

Я потерялся здесь. Какова цель? Чтобы взять строку и сделать ее целочисленной? Или преобразовать символ в ASCII? Если я использую любое число для char s[], я возвращаю это число. Если я использую любую букву, я получаю 0. Это правильный вывод? Как я могу проверить тип возвращаемого значения, чтобы узнать, что преобразование имело место?

//atoi: convert s to integer

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

int atoi(char s[])
{
    int i, n;

    n = 0;
    for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
        n = 10 * n + (s[i] - '0');
    return n;
}
int main()
{
    char s[] = "7";
    printf("atoi = %d\n", atoi(s)); //atoi = 7...is this correct?
    return 0;
}

и во второй версии K&R я получаю сообщение об ошибке, что левый операнд оператора if должен быть I-значением. Я скопировал это слово в слово из книги. Что я сделал не так?

#include <ctype.h>
#include <stdio.h>
//atoi: convert s to integer; version 2

int atoi(char s[])
{
    int i, n, sign;

    for (i = 0; isspace(s[i]); i++) //skip white space
        ;
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '+' || s[i] = '-') //skip sign
        i++;
    for (n = 0; isdigit(s[i]); i++)
        n = 10 * n + (s[i] - '0');
    return sign * n;
}
int main()
{
    char s[] = "9";
    printf("atoi = %d\m", atoi(s));
    return 0;
}

person kits    schedule 27.12.2014    source источник
comment
atoi() для преобразования "ASCII в целое число"; он принимает строку, содержащую целое число, и возвращает результат или 0, если нет ничего конвертируемого.   -  person Jonathan Leffler    schedule 27.12.2014
comment
Если я использую любое число для char s[], я возвращаю это число. Если я использую любую букву, я получаю 0. Это правильный вывод? - да   -  person M.M    schedule 27.12.2014
comment
if (s[i] == '+' || s[i] = '-') выполняет задание во 2-й половине. Это означает, что предупреждения вашего компилятора не полностью включены или у вас слабый компилятор. Предложите включить все предупреждения или изменить компиляторы.   -  person chux - Reinstate Monica    schedule 27.12.2014
comment
если вы не пишете stdlib для C, не называйте функцию так, как в стандарте   -  person phuclv    schedule 27.12.2014


Ответы (3)


Судя по всему, вы не "словно списали это с книги".

Вы используете присваивание вместо сравнения внутри оператора if.

Изменить это:

s[i] = '-'

К этому:

s[i] == '-'
person barak manos    schedule 27.12.2014
comment
Это сделало это. Спасибо барак! - person kits; 27.12.2014

Моя atoi справочная страница гласит (частично),

Функция atoi() преобразует начальную часть строки, на которую указывает nptr, в int. Поведение такое же, как

strtol(nptr, NULL, 10);

за исключением того, что atoi() не обнаруживает ошибок.

тл;др

Да. atoi("7") должно быть 7. А стандартный atoi можно найти в stdlib.h

person Elliott Frisch    schedule 27.12.2014
comment
Функция atoi была (пере)писана постером - person Ed Heal; 27.12.2014
comment
@EdHeal Он по-прежнему принимает 7 и возвращает 7. - person Elliott Frisch; 27.12.2014

Реализация atoi() выглядит правильной, хотя начальный знак плюс или минус, вероятно, следует обработать, чтобы он был совместим с реализациями библиотеки C.

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

int main()
{
    const char tests[] = {"7", "0", "10", "99", "1000", "9999", "11111",
                         "99999", "12345678"};
    int j;
    for (j = 0;  test[j];  ++j)
         printf("atoi(%s) = %d\n", tests[j], atoi(tests[j]));
    return 0;
}
person wallyk    schedule 27.12.2014