atoiの紹介とC言語でのatoiの実現

atoi

公式文書(ポータル)を見てみましょう

インターフェース

int atoi (const char * str);

文字列を整数に変換する

  • その内容を整数として解釈するC文字列strを解析します
    。整数は、int型の値として返されます。
  • この関数は
    、最初の非空白文字が
    見つかるまで、最初に必要な数の空白文字(isspaceの場合と同様)を破棄します。次に、この文字から始めて、オプションの最初の
    プラス記号またはマイナス記号の後にできるだけ多くの10進数を取り、
    それらを数値として解釈します。
  • 文字列には
    、整数を形成する文字の後に追加の文字を含めることができます。これらの文字は無視され、
    この関数の動作には影響しません
  • str内の非空白文字の最初のシーケンスが
    有効な整数でない場合、または
    strが空であるか空白文字のみが含まれているためにそのようなシーケンスが存在しない場合、変換
    は実行されず、ゼロが返されます。

パラメーター

  • 整数の表現で始まるC文字列。

戻り値

  • 成功すると、関数は変換された
    整数をint値として返します。
  • 変換された値が
    intで表現可能なの範囲外になると、未定義の動作が発生します。
    これが可能である場合、より堅牢なクロスプラットフォームの代替手段については、strtolを参照してください

拷問と言えば、コード検証を使用して検証します

int main() {
    
    
	//模拟实现atoi
	char str[] = "-22675";
	int ans = atoi(str);
	printf("%d\n",ans);
	system("pause");
	return 0;
}

演算結果:-22675

int main() {
    
    
	//模拟实现atoi
	char str[] = "   -22675";// 添加空格
	int ans = atoi(str);
	printf("%d\n",ans);
	system("pause");
	return 0;
}

演算結果:-22675

int main() {
    
    
	//模拟实现atoi
	char str[] = "   +22675";
	int ans = atoi(str);
	printf("%d\n",ans);
	system("pause");
	return 0;
}

実行結果:22675

int main() {
    
    
	//模拟实现atoi
	char str[] = " ww  +22675";
	int ans = atoi(str);
	printf("%d\n",ans);
	system("pause");
	return 0;
}

演算結果:0

int main() {
    
    
	//模拟实现atoi
	char str[] = "   +22675wer";
	int ans = atoi(str);
	printf("%d\n",ans);
	system("pause");
	return 0;
}

実行結果:22675

たくさんの拷問を試みた後、誰もが彼の機能を発見したはずです。自分でatoiを実現

C言語の実装

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<assert.h>
#include<windows.h>



int my_atoi(const char * str) {
    
    
	assert(str);
	int j = 0;
	while (str[j] != '\0') {
    
    
		// 将字符串前边的空格跳过
		while (str[j] != '\0' && str[j] == ' ') {
    
    
			j++;
		}
		//如果出现+  -  或者数字就结束循环,否则返回0
		if (str[j]!='+' && str[j] != '-' && (str[j]<'0' ||str[j]>'9')) {
    
    
			return 0;
		}
		break;	
	}
	
	// 程序走到这里说明开头是+123  或者-123类似开头
	int ans = 0;
	int tmp = 1;
	// 对 +  - 处理一下,利用tmp标记+  -
	if (str[j] == '+') {
    
    
		j++;
		
	}
	if (str[j] == '-') {
    
    
		tmp = -1;
		j++;
	}
	int count = 0;
	// 处理数字
	while (str[j] != '\0'&& str[j] >='0' &&str[j]<='9') {
    
    
		//printf("%d", pow(10, count));
		ans += pow(10,count)*(str[j] - '0');
		count++;
		j++;
	}
	int num = 0;
	// 反转一下
	while (ans) {
    
    
		num += pow(10, --count)*(ans % 10);
		ans = ans / 10;
	}
	return num*tmp;

}

int main() {
    
    
	//模拟实现atoi
	char str[] = "   +22675wer";
	int ans = my_atoi(str);
	printf("%d\n",ans);
	system("pause");
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45532227/article/details/111415517