Помещение strtol () в тест
Прекратите использовать функцию atoi ( )!Да, это золотая старенькая, часто моя функция перехода для преобразования строк в целые числа, но она слабая. Функция strtol () , с другой стороны, не только преобразует строки в целые числа, но и может проверять вводимые данные.
Помещение strtol () в тест
Прекратите использовать функцию atoi ( )! Да, это золотая старенькая, часто моя функция перехода для преобразования строк в целые числа, но она слабая. Функция strtol () , с другой стороны, не только преобразует строки в целые числа, но и может проверять вводимые данные.
Для действительно безопасного кода полезно знать, вводит ли пользователь значение 0 в виде строки или вводит бессмысленность, интерпретируемую как ноль. Как вы можете сказать?
Для действительно безопасного кода полезно знать, вводит ли пользователь значение 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, на самом деле является макросом. Я в ужасе. Столько, сколько я дорожу преобразованием строк в целые числа, я переживу это изменяющее жизнь открытие.
Вообразите мое разочарование, узнав, что функция 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);
}
Три строковые значения в массивах x
, y
и 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 () , что делает ее еще более ценной и определенно функцией преобразования, которую вы хотите использовать для потенциально неприятных входных значений. Я расскажу о некоторых методах обнаружения ошибок ввода в уроке на следующей неделе
Вообразите мое разочарование, узнав, что функция atoi () , одна из первых, которую я изучил в C, на самом деле является макросом. Я в ужасе. Столько, сколько я дорожу преобразованием строк в целые числа, я переживу это изменяющее жизнь открытие.
Функция strtol (), скорее всего, обозначает string-to-long. Она прототипирована в
Функция 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); }
Три строковые значения в массивах
x
, y
и 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. Она прототипирована в
Функция 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); }
Три строковые значения в массивах
x
, y
и 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 () , что делает ее еще более ценной и определенно функцией преобразования, которую вы хотите использовать для потенциально неприятных входных значений. Я расскажу о некоторых методах обнаружения ошибок ввода в уроке на следующей неделе
Возведение