• ベストアンサー

C言語の質問

int hensuu; char *buf; hensuuに格納された値をbufにコピーしたいのですが どうすればいいですか、教えてください。

  • kamji
  • お礼率100% (2/2)

質問者が選んだベストアンサー

  • ベストアンサー
  • VeryKasu
  • ベストアンサー率66% (2/3)
回答No.1

hensuuに格納された値を文字列に変換したいということですよね? buf = (char*)malloc(sizeof(char) * 10); sprintf(buf, "%d", hensuu); 多分こんな感じですかね。綴りが間違えてるかもしれませんが… malloc関数で10文字分のメモリ領域を確保。 sprintf関数を使ってhensuuの値を文字列に変換し、さきほど確保したメモリ領域にコピー。 文字列は最後にヌル文字(\0)が入りますので、10文字分の領域なら9桁の整数を格納することができるはずです。 ただmalloc関数を使うよりは、 char buf[10]; などとしてあらかじめ領域を確保していたほうがいいかもしれません。 用途にもよりますが…

kamji
質問者

お礼

ご丁寧に教えて頂きまして どうもありがとうございました。 解決致しました。

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> hensuuに格納された値をbufにコピーしたいのですが 文字通りの意味に解釈すると、 buf = hensuu; ただし、char*型がint型の値を格納できるかどうかは処理系に依存しますし、格納できなかった場合の動作は未定義になります。また、格納した値は、再びint型に変換した場合にのみ意味をなします。 以上は、単なるC言語の質問に対する回答ですが、インターネットビジネスのカテゴリで質問されている以上は、何か言外の事情があるのではないでしょうか?質問文から察するには限界がありますので、もう少し詳しい事情を補足してください。

kamji
質問者

お礼

申し訳ありません。 深い意味はございません。 No.1の方の答えで解決致しました。

関連するQ&A

  • C言語の配列の扱い

    次のような配列bufと変数dataを宣言して bufの中身をdataにコピーしたいのですが、 buf[0]のみで、buf[1]の値が入りません。 具体的には、buf[0]には16進数で0x3f、 buf[1]には0x3aが入っていて、 dataの値を0x3a3fにしたいのです。 教えてください。 ***************************** unsigned char buf[2]; unsigned short data; data = (unsigned short)*buf; *****************************

  • C言語のsendとrecv

    C言語でクライアントとサーバのプログラムを作りたいのですが、かなりの初心者なので、とりあえず練習用として、クライアント側に整数を入力すると、サーバ側でその整数を二乗して、結果をクライアント側に返すという簡単なプログラムを作ろうと思いました。 ソケットの作成、通信ドメインの指定等は、参考書を見ながら(というか、ほとんど丸写しみたいな感じなんですが…)、なんとかできたんですが、sendとrecvで整数を送受信するにはどうすればいいのかが分かりません。 私が持っている参考書には、 int send(SOCKETS const char FAR *buf int len int flags); int recv(SOCKETS char FAR *buf int len int flags); とあるのですが、const char FAR *buf、int len、char FAR *bufのところがよく分からないのです。 例えば、a=1000を送信したい場合、aはchar型ではないのでsendでは送れないのですか? ほんと初心者ですいませんが、どなたか教えてください。 よろしくお願いします。

  • c言語 int型の数字をchar型の配列に

    c言語についてです。 int型の数字をchar型の配列に入れたいです。 関数に対してint型の数字を文字列として渡し、 関数内でchar型の配列に格納したいです。 例として、 a(char a[]){  ~~  ~~ } int main(void){ int x = 5678;  ~~  a(x); } とできるようにしたいです。 しかしこれだと5678という値がそのままchar型の一つの配列に入る?ため正しくないです。 欲しい結果としてはちゃんとa関数内で、 a[1] = '5' a[2] = '6' a[3] = '7' a[4] = '8' となってほしいです。 もともと渡す値が”5678”となっていれば結果は正しく出るのですが、 渡す値がint型と決まっているためどうにかして5678を”5678”とすればいいのではないかと考えています。 つまり5678を単純に文字列に変換すればいいのでしょうか? またプログラム内ではsprintfやatolを使用しないで実現させたいです。 難しいかもしれませんがお願いします。 なんだか説明が下手ですみません。 お願いいたします。

  • c言語 iconv

    msys環境で実行して,指定されたファイルの文字コードをShift-JISに変換して表示するコードを作成しているのですがうまく表示されません.何がいけないのでしょうか.第1引数に変換対象のファイル名,第2引数にファイルの文字コードを指定しています. #include <stdio.h> #include <string.h> #include <iconv.h> int main(int argc, char *argv[]) { iconv_t conv; char src[10000]; char dst[10000]; int src_len = strlen(src); int dst_len = sizeof(dst) - 1; char *buf_in; char *buf_out; FILE *fp; fp = fopen(argv[1], "r"); if(NULL == fp) { printf("ファイルを開けません\n"); } else { while(fgets(src, 10000, fp) != NULL) { buf_in = src; buf_out = dst; /* 変換器を作成 */ conv = iconv_open("Shift-JIS", argv[2]); /* 変換 */ iconv(conv, &buf_in, &src_len, &buf_out, &dst_len); *buf_out = '\0'; /* 終末処理 */ /* 文字コード後の文字列を表示 */ printf("%s\n", dst); } /* 変換器を終了 */ iconv_close(conv); /*ファイルを閉じる*/ fclose(fp); } return 0; }

  • c言語 

    データを構造体の配列に格納したいのですが、このやり方ではできませんでした。どうすればいいですか? (ファイル内のデータを読み込んで格納しようとしています。) typedef struct dataset{ int price; char id; char name; }data; int main(void) { FILE *f = fopen("input.txt","r"); FILE *output = fopen("output.txt","w"); char order[100]; char name[100]; char id[100]; int price; int num = 0; while(fscanf(f,"%s",order) != EOF){ fscanf(f,"%s%s%d",product->name[num],product->id,&product[num].price); num++; } } return 0; } input.txt CD Kenji 300 DVD Nanako 350 PC Koki 1000 ........

  • 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言語の課題で困っています;

    C言語の課題で困ってます; 学校の課題で、キーボードから文字を入力する(最大80文字)。入力された文字列と、入力した文字列を逆順にした文字列を表示する。(malloc,freeを使って作成して下さい) ヒントで #invlude <stdio.h> void main(void){ char *buf; //入力文字列用 char *seq; //入力文字列用コピー用 char *rev; //逆順文字列用 int lec, i; buf =(char*)malloc(81); printf("文字列を入力:"); scanf("%s"buf ); for(i = 0; buf[i] ??? '\0'; i++){ } Ien = i; /* lenに文字列の長さが入る */ seq = ???(??? + 1); /* len+1文字文確保*/ for(i = 0; ???; i++){ seq[0] = buf[0]; } free(buf); rey = ???(len + 1); for(i = 0; < len; i++){ rev[len - i - 1] = seq[i]; } ren[i] ~ '\0'; printd("入力文字列 : %s\n",sep); でたんですが、全然分からなくて足りない部分の答えを教えてもらえると助かります;

  • C言語のsscanf関数の上手な使い方

    C言語で、 char buf[256]; char c1[10],c2[10],c3[10]; sscanf(buf,"%s%s%s",c1,c2,c3) という、バッファから文字列を読み取るとき、 bufが、 "aa bb","aa,bb","aa, bb"の場合に、 c1 = "aa bb" c2 = "aa,bb" c3 = "aa, bb" が入るようにする方法をご存知でしたら教えてください。 %[^\"]sを使ってみたのですが、c1しか格納できませんでした。 (条件) " "かつ,で区切られた部分をパラメタに格納する。 " "内には、空白や,が入る。

  • c言語についての質問です。

    charの代わりにintを使える意味が分かりません。 char c ='A' char c =65が同じなのはなぜですか? char c='A' とint c='A'が同じなのはなぜですか? こんがらがってパンクしそうです 助けてください。

  • C言語に関する質問

    初めて質問させて頂きます。C言語初心者です。 実は講義で「ファイル中の英文を単語に分けてその出現頻度をカウントするコードを木構造を用いて出力せよ」という課題が出ました。 そこで、参考にするコードを検索しましたところ、以下のURLにあるベストアンサーのコードが近いと感じました。 http://okwave.jp/qa/q4155655.html コードの内容は以下の通りになります。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> typedef struct node Node; struct node{ char *word; int count; Node *left,*right; }; Node *root=NULL; void compose(FILE *fp); void inorder(Node *p); void strlower(char *s); int main(int argc, char *argv[]) { FILE *fp; Node *new; fp=fopen(argv[1],"r"); if(fp==NULL){puts("ファイルを開けません");return(-1);} compose(fp); inorder(root); return (0); } void strlower(char *s){ while(*s!=NULL){*s=tolower(*s);s++;} } void compose(FILE*fp){ Node **p,*new; char buf[256]; while(1){ fscanf(fp,"%[^a-zA-Z0-9]",buf); if(fscanf(fp,"%[a-zA-Z0-9]",buf)==EOF)break; strlower(buf); if(root==NULL){ new=(Node *)malloc(sizeof(Node)); new->left=NULL; new->right=NULL; new->word=strdup(buf); new->count=1; root=new; }else{ *p=root; while(1){ if(strcmp(buf,(*p)->word)==0){ (*p)->count++;break; }else if(strcmp(buf,(*p)->word)<0){ if((*p)->left==NULL){ new=(Node *)malloc(sizeof(Node)); new->left=NULL;new->right=NULL;new->word=strdup(buf);new->count=1; (*p)->left=new; break; }else{ *p=(*p)->left; } }else{ if((*p)->right==NULL){ new=(Node *)malloc(sizeof(Node)); new->left=NULL; new->right=NULL; new->word=strdup(buf); new->count=1; (*p)->right=new; break; }else{ *p=(*p)->right; } } } } } } void inorder(Node*p){ if (p==NULL) return; inorder(p->left); printf("%s %d\n",p->word, p->count); inorder(p->right); } しかし、これをそのままコンパイル・実行すると、コンパイル時に以下の注意が出ます。 warning comparison between pointer and integer ('int' and 'char *') while(*s!=NULL){*s=tolower(*s);s++;} 上記の注意を無視してそのまま実行すると、segmatation faultが出てしまいますorz おそらく、sの型が*s=s[]なので、注意の中の「s++」の部分で誤作動を起こしている(s++を実行するにはsはint型でなければならない)と思うのですが、どうコード文を変えれば良いのかがよくわかりません。 どなたかお教え頂けると幸いです。どうぞよろしくお願いしますm(_ _)m

専門家に質問してみよう