ここでは、入力文字列の形式でIPアドレスを取得し、それをlong
値に変換するプログラムです。 filter_ip()
関数は、最初に文字列から数値以外の文字をすべて削除するために使用されます。次にstrtol()
を使用して、文字列をlong
の値に変換します。
strtol()
は整数オーバーフローを検出するため、よりもstrtol()
を使用する方が良いです。 errno
は、error.h
ヘッダーファイルで宣言され、strtol()
は、オーバーフローがある場合はerrno
の値を設定します。 strtol()
は、できるだけ多くの文字を文字列の先頭から変換し、残りの文字を指すようにtailptr
を設定します。変換を実行できない場合、tailptr
は文字列の先頭を指します。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
void filter_ip(char *str);
int main(void)
{
char ip_addr[] = "127.0.0.1";
long res;
char *tailptr;
printf("IP Address: %s\n", ip_addr);
filter_ip(ip_addr);
errno = 0;
res = strtol(ip_addr, &tailptr, 10);
if (errno) {
perror("Unable to convert IP address");
} else if (tailptr == ip_addr) {
fprintf(stderr, "No conversion performed\n");
} else {
printf("%ld\n", res);
}
return 0;
}
void filter_ip(char *str)
{
size_t i, j;
for (i = 0, j = 0; str[i] != '\0'; i++) {
if (isdigit(str[i])) {
str[j++] = str[i];
}
}
str[j] = '\0';
}
プログラムの出力:
IP Address: 127.0.0.1
127001
未定義の動作の多くはここにあります。あなたは基本的に最初の8文字を長いスロットにコピーして、ヌルで終わらない文字ポインタを出力しています。長い間起こっている変換は実際にはなく、プリントアウトが続かないのは幸いです。私はあなたがCの下絵を読むことをお勧めします - おそらくK&R本。 – synchronizer
すべてが間違っているので、Cブックに戻って、そのすべてがどのように動作するのかをもう少し理解したときに戻ってくるのがよいでしょう。 –
[こちらが出発点です](https://stackoverflow.com/questions/16327077) – user3386109