文字列「1234」を指すポインター lpBegin があります。今、この文字列を uint と比較したいのですが、scanf を使用せずにこの文字列を符号なし整数にするにはどうすればよいですか? 文字列番号が 4 文字の長さであることはわかっています。
8 に答える
機能を使用できますstrtoul()
。strtoul は「String to unsigned long」を表します。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char lpBegin[] = "1234";
unsigned long val = strtoul(lpBegin, NULL, 10);
printf("The integer is %ul.", val);
return 0;
}
詳細については、 http : //www.cplusplus.com/reference/clibrary/cstdlib/strtoul/ を参照してください。
機能を使用する必要がありatoi
ます。これは へのポインタを取り、char
を返しますint
。
const char *str = "1234";
int res = atoi(str); //do something with res
他の人が言ったように、私が知らなかったatoi
のは、フォーマットエラーが発生したときに何が起こるかが未定義であるため、推奨されないということです。strtoul
他の人が提案したように、より良い使用法。
確かに使いやすいatoi()。
stdlib.h を含めることを忘れないでください。
を使用できますstrtoul(lpBegin)
が、これはゼロで終わる文字列でのみ機能します。
なんらかの理由で stdlib を使用したくない場合で、ターゲット システムが確実にわかっている場合は、数値の変換を手動で行うことができます。これは、シングル バイト エンコーディング (Latin、ISO-8859-1、EBCDIC など) を使用している限り、ほとんどのシステムで動作するはずです。UTF-16 で動作させるには、'char' を 'wchar_t' (または必要なもの) に置き換えます。
unsigned long sum = (lpbegin[0] - '0') * 1000 +
(lpbegin[1] - '0') * 100 +
(lpbegin[2] - '0') * 10 +
(lpbegin[3] - '0');
または長さが不明な数値の場合:
char* c = lpBegin;
unsigned long sum = 0;
while (*c >= '0' && *c <= '9') {
sum *= 10;
sum += *c - '0';
++c;
}
strtoul
「string to unsigned long」という関数を使用する必要があります。これは stdlib.h にあり、次のプロトタイプがあります。
unsigned long int strtoul (const char * restrict nptr,
char ** restrict endptr,
int base);
nptr
文字列です。endptr
関数が有効な数値の読み取りを停止した場所を示すオプションのパラメーターです。これに関心がない場合は、このパラメーターに NULL を渡してください。base
文字列の数値形式です。つまり、10 進数は 10、16 進数は 16、2 進数は 2 などです。
例:
#include <stdlib.h>
#include <stdio.h>
int main()
{
const char str[] = "1234random rubbish";
unsigned int i;
const char* endptr;
i = strtoul(str,
(char**)&endptr,
10);
printf("Integer: %u\n", i);
printf("Function stopped when it found: %s\n", endptr);
getchar();
return 0;
}
atoi()について。
atoi() は内部的に基数 10 で strtoul を呼び出すだけです。ただし、atoi() がフォーマット エラーに遭遇した場合に何が起こるかを C 標準が定義していないため、atoi() は推奨されません。atoi() はクラッシュする可能性があります。したがって、常に strtoul() (および他の同様の strto... 関数) を使用することをお勧めします。
文字列の長さが 4 桁であることが確実であり、(何らかの理由で) ライブラリ関数を使用したくない場合は、それをハードコーディングできます。
const char *lpBegin = "1234";
const unsigned int lpInt = 1000 * (lpBegin[0] - '0') +
100 * (lpBegin[1] - '0') +
10 * (lpBegin[2] - '0') +
1 (lpBegin[3] - '0');
もちろん、egを使用することstrtoul()
は非常に優れているため、ライブラリが利用可能な場合はそれを使用してください。
strtolはatoi
、より優れたエラー処理よりも優れています。