面接問題整理1:文字列を整数に変換
タイトル:整数を表す文字列を入力し、その文字列を整数に変換して出力します.
分析:この問題は難しくないが、C/C++言語を学んだことがあると基本的な機能が実現できるのが一般的だが、プログラマーによってこの問題に書かれたコードには大きな違いがあり、プログラマーの思考とプログラミング習慣をよく反映していると言えるため、すでにマイクロソフトを含む多くの会社が面接問題として使われている.
C atoiを持参する要求:
Convert string to integer
Parses the C-string str interpreting its content as an integral number, which is returned as a value of type
The function first discards as many whitespace characters (as in isspace) as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial
plus or
minus sign followed by as many base-10 digits as possible, and interprets them as a numerical value.
The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.
If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed and zero is returned.
1、間違いやすいところに注意:
(1)空ポインタの処理;コードのロバスト性に注意してください!
(2)前のスペースを無視し、スペースには複数の表現方法がある.
(3)'+'または'-'の処理.そのため、この文字列の最初の文字を特殊に処理する必要があります.最初の文字が'+'番号の場合、何もする必要はありません.最初の文字が'-'番号であれば、この整数は負数であることを示し、最後に得られた数値を負数にします.
(4)オーバーフロー問題、処理方式;intの範囲は−0 x 7 FFF(FFFF)~0 x 7 FFF(FFFF)である.intが4バイトを占めるため、バイト数は開発環境と関係があり、16ビットのものも32ビットのものもあり、現在では多くのコンピュータが32ビットのもの、すなわち-0 x 7 FFF~0 x 7 FFFまたは-0 x 7 FFFFFFFFFFF~-0 x 7 FFFFFFFFFFFFFの範囲となっている.
(5)文字列が整数に変換できない場合のエラー処理;数字の後ろに数字以外の文字がある場合に無視する方法を採用します.
2、声明
まず、この関数をどのように宣言するかを考えます.文字列を整数に変換するので、int StrToInt(const char*str);
このような声明は問題ないように見えます.しかし、入力した文字列が空のポインタまたは不正な文字が含まれている場合、どの値を返すべきですか?0はどうですか.では、不正入力と文字列自体が「0」であることをどのように区別しますか?
次に別の考えを考えます.入力が有効かどうかを示すブール値を返し、変換された整数をパラメータリストに配置して参照またはポインタとして入力できます.bool StrToInt(const char*str,int&num);この考え方は前の問題を解決した.しかし、この関数のユーザーはこの関数を使用するとき、得られた整数を直接他の整形に与えることができず、直感的ではないと感じます.前の最初の声明は直感的だ.直感的な前提で不正入力に遭遇したときにユーザーに通知するにはどうすればいいのでしょうか.1つの解決策は、不正な入力に遭遇するたびにグローバル変数をマークするグローバル変数を定義することです.ユーザは、この関数を呼び出した後、グローバル変数を検証して変換が成功したかどうかを判断することができる.
しかし、面接では、任意の声明方式で実現することができます.しかし、面接官が私たちに選択の理由を聞いたとき、私たちは両者の長所と短所を評価しなければなりません.
第2の宣言方式はユーザーにとって非常に直感的であるが、グローバル変数を使用しており、優雅ではない.第1の考え方は,入力が正当であるか否かを返す値で示すことであり,多くのAPIでこの方法が用いられているが,この方法で宣言された関数は直感的に使用されていない.
3、実現
cのatoi関数では,数値を含まない文字列や変換できない文字列に対して0を出力するが,ここでも同様にこの方法を用いる.
分析:この問題は難しくないが、C/C++言語を学んだことがあると基本的な機能が実現できるのが一般的だが、プログラマーによってこの問題に書かれたコードには大きな違いがあり、プログラマーの思考とプログラミング習慣をよく反映していると言えるため、すでにマイクロソフトを含む多くの会社が面接問題として使われている.
C atoiを持参する要求:
Convert string to integer
Parses the C-string str interpreting its content as an integral number, which is returned as a value of type
int
. The function first discards as many whitespace characters (as in isspace) as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial
plus or
minus sign followed by as many base-10 digits as possible, and interprets them as a numerical value.
The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.
If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed and zero is returned.
1、間違いやすいところに注意:
(1)空ポインタの処理;コードのロバスト性に注意してください!
(2)前のスペースを無視し、スペースには複数の表現方法がある.
(3)'+'または'-'の処理.そのため、この文字列の最初の文字を特殊に処理する必要があります.最初の文字が'+'番号の場合、何もする必要はありません.最初の文字が'-'番号であれば、この整数は負数であることを示し、最後に得られた数値を負数にします.
(4)オーバーフロー問題、処理方式;intの範囲は−0 x 7 FFF(FFFF)~0 x 7 FFF(FFFF)である.intが4バイトを占めるため、バイト数は開発環境と関係があり、16ビットのものも32ビットのものもあり、現在では多くのコンピュータが32ビットのもの、すなわち-0 x 7 FFF~0 x 7 FFFまたは-0 x 7 FFFFFFFFFFF~-0 x 7 FFFFFFFFFFFFFの範囲となっている.
(5)文字列が整数に変換できない場合のエラー処理;数字の後ろに数字以外の文字がある場合に無視する方法を採用します.
2、声明
まず、この関数をどのように宣言するかを考えます.文字列を整数に変換するので、int StrToInt(const char*str);
このような声明は問題ないように見えます.しかし、入力した文字列が空のポインタまたは不正な文字が含まれている場合、どの値を返すべきですか?0はどうですか.では、不正入力と文字列自体が「0」であることをどのように区別しますか?
次に別の考えを考えます.入力が有効かどうかを示すブール値を返し、変換された整数をパラメータリストに配置して参照またはポインタとして入力できます.bool StrToInt(const char*str,int&num);この考え方は前の問題を解決した.しかし、この関数のユーザーはこの関数を使用するとき、得られた整数を直接他の整形に与えることができず、直感的ではないと感じます.前の最初の声明は直感的だ.直感的な前提で不正入力に遭遇したときにユーザーに通知するにはどうすればいいのでしょうか.1つの解決策は、不正な入力に遭遇するたびにグローバル変数をマークするグローバル変数を定義することです.ユーザは、この関数を呼び出した後、グローバル変数を検証して変換が成功したかどうかを判断することができる.
しかし、面接では、任意の声明方式で実現することができます.しかし、面接官が私たちに選択の理由を聞いたとき、私たちは両者の長所と短所を評価しなければなりません.
第2の宣言方式はユーザーにとって非常に直感的であるが、グローバル変数を使用しており、優雅ではない.第1の考え方は,入力が正当であるか否かを返す値で示すことであり,多くのAPIでこの方法が用いられているが,この方法で宣言された関数は直感的に使用されていない.
3、実現
cのatoi関数では,数値を含まない文字列や変換できない文字列に対して0を出力するが,ここでも同様にこの方法を用いる.
bool isspace(char x)
{
if(x==' '||x=='\t'||x=='
'||x=='\f'||x=='\b'||x=='\r')
return true;
else
return false;
}
int atoi(char *nptr)
{
if( !nptr ){ //null
return 0;
}
int result = 0; /* current result */
bool isNeg = false; /* if '-', then negative, otherwise positive */
/* skip whitespace */
while ( isspace(*nptr) )
++nptr;
if ( *nptr == '-'){
isNeg = true;
nptr++; /* skip sign */
}else if ( *nptr == '+'){
isNeg = false;
nptr++; /* skip sign */
}
while ( *nptr != '\0') { //not end
if( *nptr < '0' || *nptr > '9' ){ //non-number
break;
}
result = 10 * result + (*nptr - '0'); /* accumulate digit */
if(result > 0X7FFFFFFF) /* over flow 32*/
{
cout << "over flow" << endl;
result = 0;
break;
}
nptr++; /* get next */
}
if (isNeg)
result = - result;
return result;
}