• ベストアンサー

C言語の [ atoi ] について

kabasanの回答

  • kabasan
  • ベストアンサー率44% (264/588)
回答No.1

まず、「文字列」と「変数」の違いは理解していらっしゃるでしょうか? atoiは「ank to integer」を縮めたもので、”12345”という「文字列」を12345という整数型の「変数」へ変換する関数です。 文字列が「12345ABC」のように、数字以外の文字が入っていた場合の動作は定義されておらず、処理系によって動作はまちまちです。つまり不正な入力で、プログラマーの責任で文字列に数字以外が含まれていないかチェックすべきです。 表示する場合は、整数型変数ですから、 printf("%d",i); と指定しないとエラーとなります。

関連するQ&A

  • C言語 atoi関数

    入力された年号と年数から(和暦)、西暦を算出するプログラムです。 年号の入力チェックのところが、どうしてもうまくいきません。  year_name = atoi( yn_buf ); year_name にatoi()で変換された値が入りません。 初期値のゼロのままです。その為、年号に何を入力してもエラーメッセージが表示されてしまいます。 atoi関数の使い方が間違っているのでしょうか? すみませんが、教えて下さい。 int year_name = 0; /* 年号を格納 */ int years = 0; /* 年数を格納 */ int check_flg = FALSE; /* 入力チェック 初期値としてエラー有状態とする*/ char yn_buf[32] = { '\0' }; /* 年号のチェック用 */ char y_buf[32] = { '\0' }; /* 年数のチェック用 */ printf( "<年号> 明治:m 大正:t 昭和:s 平成:h \n" ); printf( " 年号と年数を入力して下さい。 " ); scanf( "%s%s", &yn_buf, &y_buf ); printf("\n"); while( 1 ) /* 年号チェック */ { if( strlen( yn_buf ) >= 2 ) /* 年号が2文字以上の時、エラー */ { printf(" ▲エラーメッセージ 年号は1文字で入力して下さい。\n"); } else { year_name = atoi( yn_buf ); if( ( year_name == 'm' ) || ( year_name == 't' ) || ( year_name == 's' ) || ( year_name == 'h' ) ) { /* 年号が正しく入力されている時 */ break; } else { /* 年号が正しく入力されていない時 */ printf(" ▲エラーメッセージ 年号は、「 m, t, s, h 」のいずれかを入力して下さい。\n"); } } printf( " 年号を入力して下さい。 " ); scanf( "%s", &yn_buf ); printf("\n"); }

  • C言語 中級編

    失礼します。現在書籍にて勉強しているのですが、エラーが出てしまい調べてみたのですが原因がわかりません。何卒よろしくお願いします。 /* 文字列として読み込んだ整数を変換して表示 */ #include <stdio.h> #include <stdlib.h> int main(void) { char temp[20]; /* 読込み用文字列 */ printf("整数を入力してください:"); scanf_s("%s", temp); printf("%dと入力しましたね。\n", atoi(temp)); return 0; } エラーメッセージ ハンドルされない例外が 0xFEFEFEFE (helloworld.exe) で発生しました: 0xC00001A5: 無効な例外ハンドラー ルーチンが検出されました。 (パラメーター: 0x00000003)。

  • strncpy後のatoiがおかしい

    こんにちは。 C++をVS2005でやっています。 atoi関数を使っているんですが、10個の配列strにstrncpyをやると値がおかしくなります。 10個目に'\0'を代入させてやってみても駄目でした。 以下にソースを載せます。 #include <string.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> int main( void ) { char string[256]; char str[10]; char *moji = "12345464"; int l; // using template versions of strcpy_s and strcat_s: strcpy(string, "6877897898"); strcat(string, "strcpy_s"); strcat(string, "and"); // of course we can supply the size explicitly if we want to: strcat(string, "strcat_s!"); strncpy(str, string, 10); l = strtol(str,NULL,10);// 値が違う 6877897898にならない printf("str = %d\n", l); l = atoi(moji); printf("moji = %d\n", l); l = atoi(string);// 値が違う printf("string = %d\n", l); printf("String = %s\n", string); getchar(); return 0; } 表示結果 str = 2147483647 moji = 12345464 string = 2147483647 String = 6877897898 mojiは正常に動作しますから、ナル文字が原因なのかと思ってしまいますが。原因がいまいち分かりません。 よろしくお願いします。

  • C言語のプログラミングでつまずいてます

    ポインタをりようする。string.hとctype.hに含まれる関数は使用しないこと。 以下の実行例のように、文字列を受け取り、アルファベットの大文字を小文字にして表示する関数を作成したいのですが 実行例: Original string is <AbCdE1f2> Modified string is <abcde1f2> #include <stdio.h> #define NUMOFCHAR 10 void print_char(char *ptr); int main(void) { char string[NUMOFCHAR+1]; printf("Input a sentence (# of letters <= %d): ", NUMOFCHAR); fflush(stdout); scanf("%s", string); string[NUMOFCHAR] = '\0'; printf("Original string is <%s>\n", string); printf("Modified string is <"); print_char(string); printf(">\n"); return 0; } void print_char(char *ptr) { int i=0; for(i=0 ; i<NUMOFCHAR+1 ; i++){ if( *ptr>='A' && *ptr<='Z'){ *ptr += 'A'-'a' ; } ptr++ ; } printf("%s",ptr); } よ書いたのですがビルドえらーがおこります。 どこがだめなのかわかりません。。。 C言語に詳しい人でわかるかた、どこがいけないのか、なぜいけないのか、どうすればいいのか詳しくおしえてください。 お願いします

  • atoi

    123と表示されたいんだけど、コンパイルエラーです。 この場合、atoiの引数して、str[3]の文字を入れる変数をもう1つ用意するしかないですか? キャストでうまくできる方法があったら教えてください。 strという変数の"abc123"という文字は変化させたくないんです。 #include <iostream.h> main(){  int i;  char str[] = "abc123";  i = atoi(str[3]);  printf("%d\n", i); }

  • C言語の初歩的な質問

    質問1----------------------------------------- #include<stdio.h> int main() {  int a;  char b[10];  for(int i = 0;i < 2;i++){   scanf("%d",&a);   printf("整数%d\n",a);  }  scanf("%s",b);  printf("文字列%s\n",b); } /* この際に、例えばabと入力すると結果が 整数-858993460 整数-858993460 文字列ab となり整数入力を無視して進められるのはなぜでしょうか? */ 質問2----------------------------------------- #include<stdio.h> void func(int**); int main() {  int *p;  func(&p);  printf("%d",*p); } void func(int **pp) {  int n = 10;  *pp = &n; } /* func関数のnはスコープからはずれて変数の寿命がなくなるはずなのにprintfで表示されるのはなぜでしょうか? */ ---------------------------------------------- C言語は一冊の本とネットの入門サイトをかじった程度の理解です。

  • C言語で分からないところがあるのですが

    すみません。C言語のポインタで分からないことがあって来ました。 ポインタの理屈は理解してはいるのですが、いざソースコードを書いてみようということになると全く手がつけられずにいます。 以下のソースコードですが、strlen()と同じ働きをする関数mystrlen()と、strcmp()と同じ働きをする関数mystrcmpを、ポインタを使って作成するものです。どこをどうすればいいのか教えてくださいませんか。 #include <stdio.h> int main(void) { char str1[80], str2[80]; int i, j; int len1, len2; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /* * 文字列の長さを確認する */ /* NULL文字(文字列の最後)まで読み飛ばす */ for (len1 = 0; len1 < 80 && str1[len1] != '\0'; len1++) ; /* ループ終了後、len1 に文字列の長さが入っている */ if (len1 < 80) { printf("%s は %d 文字の長さです\n", str1, len1); } else { printf ("第1の文字列が80字以上あります\n"); } /* str2 についても同様 */ for (len2 = 0; len2 < 80 && str2[len2] != '\0'; len2++) ; if (len2 < 80) { printf("%s は %d 文字の長さです\n", str2, len2); } else { printf ("第2の文字列が80字以上あります\n"); } if (len1 < 80 && len2 < 80) { for (i = 0; i < 80 && str1[i] != '\0' && str2[i] != '\0' && str1[i] == str2[i]; i++) ; if (str1[i] == str2[i]) { /* 両者同時に == '\0' のはず*/ printf("文字列は等しい\n"); } else if (str1[i] < str2[i]) { /* str1[i] == '\0' のはず*/ printf("%s は %s より小さい\n", str1, str2); } else { /* str2[i] == '\0' のはず*/ printf("%s は %s より大きい\n", str1, str2); } } /* * 十分なスペースがあれば、str2をstr1の最後に連結する */ if (len1 + len2 < 80) { /* str1 の末尾を探す */ for (i = 0; str1[i] != '\0'; i++) ; /* ループを抜けた段階では i は len1 と同じはずなので、 上記のループを作らず、i の代わりに len1 を用いるのも可 */ /* それ以降に str2 の中身をコピーする */ for (j = 0; str2[j] != '\0'; j++) { str1[i+j] = str2[j]; } str1[i+j] = '\0'; printf("%s\n", str1); } else { printf ("文字列をつなげた長さが80字以上あります\n"); } /* * str2をstr1にコピーする */ if (len1 + len2 < 80) { for (i = 0; str1[i] != '\0'; i++) { str1[i] = str2[i]; } str1[i] = '\0'; printf("%s %s\n", str1, str2); } return 0; }

  • 文字列を実数に変換するにはどうしたらいいでしょうか

    本に文字列を整数に変換する「atoi」はあったのですが、文字列を実数に変換する関数はないのでしょうか。教えて下さい。

  • atoiについての疑問

    いつもお世話になっております。 またしても、教えていただきたい事がありまして質問させていただきます。 年月を『YYYY/MM/DD』形式で入力するプログラムで、『YYYY/MM/DD』形式以外の形式や暦として不正な値を入力すると、再度入力を促すプログラムを作成しています。 そこで、「strtok関数」を使い"/"で区切った文字列を「atoi関数」で数値にしようと思いました。(この方法で良いかは分からないのですが、他の方法が思い浮かばなかったので…) そこで、以下のようなプログラムを作ってみたのですが、結果を表示すると、なぜか最後の数字が1文字消えてしまいます。 ↓このようなソースを作りました。 【作ったソース】 #include<stdio.h> #include<stdlib.h> #include<string.h> void manth_view(void) { char nengetu[30],*syear; int year,manth; printf("年月を入力して下さい。>>"); fgets(nengetu,sizeof(nengetu),stdin); syear = strtok(nengetu,"/"); year = atoi(syear); printf("入力された年 %d\n",year); manth=atoi(strtok(NULL,"/")); printf("入力された月 %d\n",manth); } 【結果】入力した年月→2007/12  入力された年 200  入力された月 1 上記の結果のように、どのように入力しても、最後の1文字が消えてしまいます。 何故なのか昨日からずっと考えているのですが、分かりません。 どうか教えてください。

  • C言語 コンパイルできるが実行するとエラー

    非負の数字を入力してもらい表示させ、数字以外を入力した場合は終了するプログラムです↓(VC使用) ━━━━━━━━━━━━━━━━━━━━━━━━━━ #include "stdafx.h" #include <stdio.h> #include <stdlib.h> /* atoi使用 */ #include <ctype.h> /* isdigit使用 */ int main(void) {   char cx;   int nx;   printf("非負の整数を入力してください。:");   scanf("%s", cx);   if(isdigit(cx) == 0){     printf("数字を入れてください。\n");   }else{     nx = atoi((const char*) cx);   }   printf("%d", nx);   return 0; } ━━━━━━━━━━━━━━━━━━━━━━━━━━ 実行し文字を入力するとDebug Error!と小窓がでます。どこがおかしいのでしょうか?