こんばんは。
C言語を勉強しているのですが、わからない事が有り投稿しました。

atoi関数と同じような関数を作ろうとして、配列の中の
数字を取り出し、関数内の別配列に収めたのですが、これをint型としてmainに戻す場合どのようにして型変換をしたらよいのかわかりません。
(取り出した数字の並びはそのままで)
何か方法をご存知の方がいましたら、回答をお願いします。

A 回答 (1件)

つまり、「数字で構成された文字列を、int型に変換したい」ということでいいのでしょうか?



ならば、
 int my_atoi(char *str)
 {
   int ret = 0;
 
   while (isdigit(*str))    /* isdigit()を使うには、ctype.hが必要 */
     ret = ret*10 + (*str++ - '0');
   return ret;
 }
で良いでしょう。

ちなみに、数字列→数値の変換は、「型変換」ではなくて「データ変換」といいます。
    • good
    • 0
この回答へのお礼

回答下さりありがとうございました。

型変換ではなくデータ変換というのですね。
勉強になりました。
ありがとうございました。

お礼日時:2001/10/17 18:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

Qchar型+char型ってint型? if(char型==int型)?

C言語の「汎整数拡張(インテグラルプロモーション)」というものに関するものだと思います。

char型とchar型を加えた結果は、char型でしょうか。それともint型でしょうか。
(下のプログラムの
printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */
という部分の結果は4なので、int型と考えるべきなのかな。)

私は、char型とint型の加算の結果はint型だと思っていましたが、
char型とchar型の加算の結果はやはりchar型だと思っていました。
(それが間違えているのでしょうか。)


if(a[0]==i) /* char型とint型の比較(?) */
の部分では、左辺はchar型、右辺はint型ですが、このように型の違う変数を比較しても文法上構わないのでしょうか。
(私は、「比較は必ず型の同じもの同士でしかできない」と思っていました。)
左辺はchar型のように見えて、じつはint型ですか。


#include <stdio.h>
int main(void)
{
char a[4];
int i=77;
printf("sizeof(int)は%d\n", sizeof(int));
printf("sizeof(char)は%d\n", sizeof(char));
printf("sizeof('M')は%d\n", sizeof('M'));
printf("sizeof(a[0])は%d\n", sizeof(a[0]));

a[0]='M';
a[1]=7+6;
a[2]=a[0]+a[1];
printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */
printf("sizeof(+a[0])=%d\n", sizeof(+a[0]));

if(a[0]==i) /* char型とint型の比較(?) */
puts("a[0]==i");
else
puts("a[0]!=i");

return(0);
}

ちなみにワーニングもエラーもなんにもでません。

C言語の「汎整数拡張(インテグラルプロモーション)」というものに関するものだと思います。

char型とchar型を加えた結果は、char型でしょうか。それともint型でしょうか。
(下のプログラムの
printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */
という部分の結果は4なので、int型と考えるべきなのかな。)

私は、char型とint型の加算の結果はint型だと思っていましたが、
char型とchar型の加算の結果はやはりchar型だと思っていました。
(それが間違えているのでしょう...続きを読む

Aベストアンサー

「sizeof 単項式」について補足です。

これは sizeof 演算子が「単項演算子」であるために書かれたものだと思われます。
例えば同様に単項演算子である ++ も、「++ 単項式」です。

では単項式とは何なのかというと、これは以下のようなものを指します。(抜けがあるかもしれませんが。)
・定数
・名前(変数名や関数名など)
・( 式 )
・後置式

( 式 ) はおなじみの「式の結果を返す」ものですが、実はこれ全体で単項式です。
本来「sizeof 単項式」では ( ) を必要としないので、sizeof より優先順位の低い演算子を含む式を裸で渡すことはませんが、( ) で囲めばどんな式でも書けるわけです。

後置式は「配列構文によるアドレス参照式」や「関数呼び出し式」、「メンバ参照式」「後置型インクリメント/デクリメント式」です。
なので、
> sizeof(a[0])
> と書いたら、[ ] という演算子は2項演算子だから、a[0]は単項式になっていない
は、わざわざ ( ) で囲まず sizeof a[0] と書いても、正しい単項式なので問題ありません。
(これらの演算子は、全て sizeof より優先順位が上になっています。)

先に ++ も単項式を取る、ということを書きましたが、++ だって
  ++*(p + n)
のような記述が通るのだから、sizeof でも問題がなくて当然です。

また、例えば ++ では「オペランドは左辺値でなければならない」という原則があり、左辺値でない式に ++ を適用するとコンパイルエラーが発生します。
しかし、sizeof に「オペランドはオブジェクトでなければならない」などという原則を聞いたことがありません。
無論コンパイルエラーも起きませんし、期待通りに式の値のサイズが返ります。
「式の値のサイズ」というのはコンパイル時に判明しているものなので、取得できて当然といえば当然ですが、これがCで定められた仕様かどうかというのは残念ながら見つけることはできませんでした。
ただし、質問にあるような sizeof の文法は全て正しく、警告が出ないのは仕様通りだというのは間違いありません。

「sizeof 単項式」について補足です。

これは sizeof 演算子が「単項演算子」であるために書かれたものだと思われます。
例えば同様に単項演算子である ++ も、「++ 単項式」です。

では単項式とは何なのかというと、これは以下のようなものを指します。(抜けがあるかもしれませんが。)
・定数
・名前(変数名や関数名など)
・( 式 )
・後置式

( 式 ) はおなじみの「式の結果を返す」ものですが、実はこれ全体で単項式です。
本来「sizeof 単項式」では ( ) を必要としないので、sizeof より優...続きを読む

Q44行目: パラメータ '__format' は const signed char * 型として定義されているので int は渡せない(関数 main )

☆--------------ソース--------------☆
#include <stdio.h>

struct seiseki {
int no;
char fname[20];
char lname[20];
int val[3];
}seito;

int main(void)
{
int i,total;
FILE *fp;
FILE *file;
struct seiseki seito[20];
char buf[1024];
fp = fopen("in.txt", "r");
i=0;
while( fgets(buf, sizeof(buf), fp) ){
struct seiseki tmp;
sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]);
seito[i++] = tmp;
}
printf("ID / NAME / 数(1) / 数(2) / 数(3) \n");
for(i = 0; i < 3; i++) {
printf("%d / %s %s / %d / %d / %d\n",
seito[i].no,seito[i].lname,seito[i].fname, seito[i].val[0], seito[i].val[1], seito[i].val[2]);

}
file = fopen("output.html","w");
fprintf(file ,"<HTML><HEAD></HEAD><BODY><table border=1 bodercolor=black cellspacing=0 width=700>\n");
fprintf(file ,"<tr bgcolor=#FF7575><td>ID</td><td>氏名</td><td>数(1)</td><td>数(2)</td><td>数(3)</td><td>合計点</td><td>平均点</td><td>偏差値</td><td>順位</td></tr>\n");
for(i = 0; i < 3; i++) {
fprintf(file ,seito[i].lname);
fprintf(file ,seito[i].fname);
☆省略☆
fprintf(file ,seito[i].val[0]);
☆省略☆

}
fprintf(file ,"\n</table></BODY></HTML>\n");
return 0;
}

☆--------------ソース--------------☆
#include <stdio.h>

struct seiseki {
int no;
char fname[20];
char lname[20];
int val[3];
}seito;

int main(void)
{
int i,total;
FILE *fp;
FILE *file;
struct seiseki seito[20];
char buf[1024];
fp = fopen("in.txt", "r");
i=0;
while( fgets(buf, sizeof(buf), fp) ){
struct seiseki tmp;
sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]);
seito[i++] = tmp;
}
printf("I...続きを読む

Aベストアンサー

fprintf(file ,seito[i].val[0]);を
fprintf(file ,"%d",seito[i].val[0]);
にしてみて下さい。

Qchar型全角数字から、int型半角数字への変換方法

char型全角数字から、int型半角数字への変換するためには
どのような方法があるのかを探しています。

同カテゴリ内でも色々と検索を掛けて見たのですが
適当なものが見当たらなかったため、質問させていただきます。

chara kazu[]="8";(全角数字)

int kazu2=8;(半角数字)
に変換するためにはどうすればよいでしょうか?
変数に代入してfor文で使用が目的です。

宜しくお願い致します。

Aベストアンサー

★アドバイス
・マイクロソフト社製のコンパイラなら全角文字コードから半角文字コードへの
 変換関数があります。→_mbctombb()昔はzentohan()という名前でした。懐かしい。
 http://msdn.microsoft.com/ja-jp/library/ms350177(VS.71).aspx→『_mbctombb』
 これを使えば数字以外にも英字、記号も対応する半角文字に変換できます。

サンプル:
#include <stdio.h>
#include <mbstring.h>

// メイン関数
int main( void )
{
 unsigned char kazu[] = "1234567890";
 unsigned char *p;
 unsigned int moji;
 
 for ( p = kazu ; *p != '\0' ; p += 2 ){
  moji = (p[0] << 8) | p[1];
  moji = _mbctombb( moji );
  printf( "%c%c→%c\n", p[0], p[1], moji );
 }
 return 0;
}
または
unsigned char kazu[] = "8";
unsigned int moji;

moji = _mbctombb( (kazu[0] << 8) | kazu[1] );
printf( "%s→%c\n", kazu, moji );

※マイクロソフト社製以外のコンパイラや移植性も考えるならご自分で
 全角文字→半角文字の変換するルーチンを書いて下さい。仕組みは
 既にredfox63さんが回答しています。なお、いろいろな方法があります。

参考URL:http://msdn.microsoft.com/ja-jp/library/ms350177(VS.71).aspx

★アドバイス
・マイクロソフト社製のコンパイラなら全角文字コードから半角文字コードへの
 変換関数があります。→_mbctombb()昔はzentohan()という名前でした。懐かしい。
 http://msdn.microsoft.com/ja-jp/library/ms350177(VS.71).aspx→『_mbctombb』
 これを使えば数字以外にも英字、記号も対応する半角文字に変換できます。

サンプル:
#include <stdio.h>
#include <mbstring.h>

// メイン関数
int main( void )
{
 unsigned char kazu[] = "1234567890";
 unsigned char *p...続きを読む

Q44行目: パラメータ '__format' は const signed char * 型として定義されているので int は渡せない(関数 main )

たびたび、Cについてご質問させて頂いていますが件名のようなエラーで行き詰まっています。

内容は、textファイルを読み込み、htmlファイルを生成するといったものです。成績管理みたいなことをしたいと考えています。とりあえず、44行目に
fprintf(file ,seito[i].val[0]);
で数(1)の点数をHTMLに書き込みたいのですが、
件名のエラーが表示されうまくコンパイルができない状態です。お助けくださいませ。よろしくお願いいたします。

Aベストアンサー

fprintfは、引数として
ファイルポインタ、出力書式文字列、変数並び
をとります。
質問文の場合、出力書式文字列がありません。
"%d"のような感じで書きます。

出力書式については、調べてみて下さい。


人気Q&Aランキング

おすすめ情報