ページ 11

文字列が変換されてない?

Posted: 2013年6月22日(土) 21:16
by Sirius
このプログラムを見てください

コード:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	char str[] ="12345";

	printf("str       =\"%s\"\n", str);
	printf("atoi(str) = %d\n", atoi(str) );

	if(str[0] == 1)
		puts("数字です");
	if(str[0] == '1')
		puts("文字です");

	return 0;
}
このプログラムでは

コード:

str        ="12345"
atoi(str)  = 12345
文字です
と表示されます。なぜatoi関数で変換したにもかかわらず、
文字のままなのでしょうか?

Re: 文字列が変換されてない?

Posted: 2013年6月22日(土) 21:19
by h2so5
atoiは数字に変換したものを返すだけです。引数(str)の内容に変更を加えるわけではありません。

Re: 文字列が変換されてない?

Posted: 2013年6月22日(土) 21:20
by softya(ソフト屋)
atoiは文字列を参照しただけで、元の文字列を変換したり、作り変えるわけではありません。

Re: 文字列が変換されてない?

Posted: 2013年6月22日(土) 21:41
by Sirius
そうだったのですね。
atoiとはまた他の関数で それを引数に使った時には
ずっとその関数の効果が持続していたのでatoi関数の効果が持続しなかった理由がわからなかったんです。

「atoiは元の数に変更を加えるわけではない」
それで効果が持続していた関数は
「元の数に変更を加えていた」
ということなんですね

ありがとうございました。

Re: 文字列が変換されてない?

Posted: 2013年6月22日(土) 21:43
by softya(ソフト屋)
そもそも型が違うのでchar型にint型は桁あふれ発生で代入できないです。

Re: 文字列が変換されてない?

Posted: 2013年6月23日(日) 10:26
by asd
Sirius さんが書きました:そうだったのですね。
atoiとはまた他の関数で それを引数に使った時には
ずっとその関数の効果が持続していたのでatoi関数の効果が持続しなかった理由がわからなかったんです。
その他の関数が何か分かりませんが、atoi関数は以下のような宣言がなされています。

コード:

int atoi( const char *str );
引数の文字列はconst修飾子により変更されないことが保障されているので、atoi関数実行後に引数の文字列が編集されていることはありません。

引数に指定されたポインタが変更される関数の例としてぱっと浮かんだのはstrtok関数ですかね。

コード:

char *strtok(char *s1, const char *s2)
第1引数に指定された文字列を第2引数で指定されたデリミタ(区切り文字)で分解しトークンを得る関数ですが、
第1引数の文字列中のデリミタは\0に置き換えられていくので、この関数の後で元の文字列を参照しようとしてハマることがあります(汗)
オフトピック
このコメントを編集するつもりが引用返信になっていて、引用のみのコメントを新規投稿してしまったので、削除しています。