次のようにchar配列[]を変換したい:
char myarray[4] = {'-','1','2','3'}; //where the - means it is negative
そのため、整数でなければなりません。[〜#〜] c [〜#〜]のstandard libariesを使用した-1234です。エレガントな方法を見つけることができませんでした。
確かに '\ 0'を追加できます。
個人的にはatoi
関数が好きではありません。 sscanf
をお勧めします:
char myarray[5] = {'-', '1', '2', '3', '\0'};
int i;
sscanf(myarray, "%d", &i);
これは非常に標準的なもので、stdio.h
図書館 :)
そして、私の意見では、atoi
よりもはるかに自由であり、数字文字列を任意にフォーマットでき、おそらく最後に数字以外の文字も使用できます。
[〜#〜] edit [〜#〜]この素晴らしいものを見つけました 質問 このサイトで説明と比較をしています3つの異なる方法-atoi
、sscanf
、strtol
。また、sscanf
(実際には、*scanf
機能)。
EDIT2atoi
関数を個人的に嫌うだけではないようです。 atoi
関数は非推奨であり、新しいコードでは使用すべきではないことを説明する回答の link です。
なぜatoiを使用しないのですか?例えば:
char myarray[4] = {'-','1','2','3'};
int i = atoi(myarray);
printf("%d\n", i);
予想どおりに私に与えます:
-123
更新:なぜそうではない-文字配列はヌルで終了していません。ドッ!
配列を文字列に変換せずに文字配列自体を処理するのはそれほど難しくありません。特に、文字配列の長さがわかっている場合、または簡単に見つけることができる場合。文字配列の場合、長さは配列定義と同じスコープで決定する必要があります。例:
size_t len sizeof myarray/sizeof *myarray;
もちろん、文字列の場合、strlen
を使用できます。
文字配列であるか文字列であるかに関係なく、既知の長さで、次のような短い関数を使用して文字値を数値に変換できます。
/* convert character array to integer */
int char2int (char *array, size_t n)
{
int number = 0;
int mult = 1;
n = (int)n < 0 ? -n : n; /* quick absolute value check */
/* for each character in array */
while (n--)
{
/* if not digit or '-', check if number > 0, break or continue */
if ((array[n] < '0' || array[n] > '9') && array[n] != '-') {
if (number)
break;
else
continue;
}
if (array[n] == '-') { /* if '-' if number, negate, break */
if (number) {
number = -number;
break;
}
}
else { /* convert digit to numeric value */
number += (array[n] - '0') * mult;
mult *= 10;
}
}
return number;
}
上記は、標準のcharからintへの変換アプローチであり、いくつかの追加の条件が含まれています。 digits
と'-'
に加えて、浮遊文字を処理するための唯一のトリックは、数字の収集を開始するタイミングと停止するタイミングについて賢明な選択をすることです。
最初のdigits
に遭遇したときに変換のためにdigit
の収集を開始した場合、最初の'-'
またはnon-digit
に遭遇すると変換は終了します。これにより、(例:file_0127.txt
)などのインデックスに関心がある場合、変換がはるかに便利になります。
その使用の簡単な例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int char2int (char *array, size_t n);
int main (void) {
char myarray[4] = {'-','1','2','3'};
char *string = "some-goofy-string-with-123-inside";
char *fname = "file-0123.txt";
size_t mlen = sizeof myarray/sizeof *myarray;
size_t slen = strlen (string);
size_t flen = strlen (fname);
printf ("\n myarray[4] = {'-','1','2','3'};\n\n");
printf (" char2int (myarray, mlen): %d\n\n", char2int (myarray, mlen));
printf (" string = \"some-goofy-string-with-123-inside\";\n\n");
printf (" char2int (string, slen) : %d\n\n", char2int (string, slen));
printf (" fname = \"file-0123.txt\";\n\n");
printf (" char2int (fname, flen) : %d\n\n", char2int (fname, flen));
return 0;
}
注:'-'
で区切られたファイルインデックス(など)に直面した場合、結果を無効にするのはユーザー次第です。 (例:file-0123.txt
はfile_0123.txt
と比較され、1番目は-123
を返し、2番目は123
を返します)。
出力例
$ ./bin/atoic_array
myarray[4] = {'-','1','2','3'};
char2int (myarray, mlen): -123
string = "some-goofy-string-with-123-inside";
char2int (string, slen) : -123
fname = "file-0123.txt";
char2int (fname, flen) : -123
注:問題を引き起こす可能性があるコーナーケースなどが常にあります。これは、すべての文字セットなどで100%防弾となることを意図したものではありませんが、代わりに圧倒的大部分を処理し、atoi
またはstrtol
など.
したがって、アイデアは、文字番号(単一引用符で囲んだ例、「8」など)を整数式に変換することです。たとえば、char c = '8'; int i = c-'0' //整数8が得られます。そして、ループで行われる908 = 9 * 100 + 0 * 10 + 8という原則によって、変換されたすべての数値を合計します。
char t[5] = {'-', '9', '0', '8', '\0'}; //Should be terminated properly.
int s = 1;
int i = -1;
int res = 0;
if (c[0] == '-') {
s = -1;
i = 0;
}
while (c[++i] != '\0') { //iterate until the array end
res = res*10 + (c[i] - '0'); //generating the integer according to read parsed numbers.
}
res = res*s; //answer: -908