お世話になります、フジと申します。
今回皆様にお聞きしたいことはchar型変数の操作についてなのですが、次のプログラムのようにchar型に代入した整数を16進数用に変換させ、最後に同じchar型の変数に代入したいと考えています。
int a,b,c;
char data = 48; //dataに10進数48を代入
c = (int)data; //ここでcは48になる
a = c/16;          //16進数用に変換
b = c%16;
c = 10*a + b;        //ここでcは30になる
このint型変数c(30)をchar型変数dataに代入するにはどうしたらいいでしょうか?
char buf[5];
sprintf(buf,"%d",c);
にすればchar型の配列に代入することは出来ますが、これだとcの値30がbuf[0]=3,buf[1]=0となってしまい、目的の操作が達成できません。
よい方法をしっている方がいましたら、宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

data='30';


といった動作を求めているのであれば、不可能です。
char型は1文字しか扱えませんから。

あと、10→16の基数変換やってる割にa~fがない(a>10及びb>10が考慮されてない)のはまずいのでは?
    • good
    • 0

目的をはっきりさせましょう


bufに文字列として取り出したいのならお示しの方法になります
別のやり方なら sprintf( buf, "%x", data ); でも同じことです
この場合 buf[0]='3', buf[1]='0', bud[2]=0 といった具合になります

data = 47だった場合はどうするのでしょう?
a = c /16 = 2
b = c % 16 = 15
c = 10 * a + b = 10 * 2 + 15 = 35
これが期待する答えなのでしょうか?
    • good
    • 0

charもintも器の大きさ(表現可能範囲)が違うだけで数値です。


コンピュータ内の数値は全部2進数で、それを10進表記するか、
16進表記するかは利用者の好みの問題です。
>c = 10*a + b; //ここでcは30になる
cを48(10進数)から30(10進数)にしただけで、意味ある行為とは
思えません。表記を変えたいなら以下の通りです。
sprintf(buf,"%d",data); //10進表記
sprintf(buf,"%x",data); //16進表記
    • good
    • 0

>16進数用


の意味が若干理解しづらいのですが、

cの計算結果をdataの値を30にしたいだけであれば、
>c = (int)data; //ここでcは48になる
の逆を行えばいいだけです。
data = (char)c;
と。
    • good
    • 0

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

Qint型にchar型が代入されたときの処理について

初歩的な質問かとは思いますがどうぞよろしくお願いいたしますm(__)m

何のプログラムかというとファイルに名前、年齢、職業、メールアドレス、パスワードを書き込むプログラムをC言語で作成をおこないました。
仕様としてはあらかじめ入力しておいてそこに一部変更するときに用いるものとして設計しました。
別のところで登録してから変更時にこのプログラムを使う予定ですが今回は予め値を代入しています。
一部変更ということで変更箇所を選択して変更するためswith文を用い、変更箇所が2箇所以上ある場合でも大丈夫なように設定終了を選択するまでdo while文でループさせようとした結果、下記のようなプログラムになりました

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

int main() {
FILE *outputfile; // 出力ストリーム

outputfile = fopen("/home/meibo.txt", "w"); // ファイルを書き込み用にオープン(開く)
if (outputfile == NULL) { // オープンに失敗した場合
printf("cannot open\n"); // エラーメッセージを出して
exit(1); // 異常終了
}

char name[100] = "山田太郎";
int toshi = 24;
int jobnum = 1;
//char job[10] = "学生";
char mail[100] = "yamada@gmail.com";
char pass[100] = "yamada";
int ok = 0;
int config;
//ファイル書き込み
fprintf(outputfile, "%s\n", name);
fprintf(outputfile, "%d\n", toshi);
if (jobnum == 1) {
fprintf(outputfile, "学生\n");
} else if (jobnum == 2) {
fprintf(outputfile, "社会人\n");
} else {
fprintf(outputfile, "その他\n");
}
fprintf(outputfile, "%s\n", mail);
fprintf(outputfile, "%s\n", pass);

do {
printf("変更したい設定を選択してください\n");
printf("名前:1\n");
printf("年齢:2\n");
printf("仕事:3\n");
printf("メールアドレス:4\n");
printf("パスワード:5\n");
printf("設定終了:6\n");
scanf("%d", &config);

switch (config) {
case 1:
printf("名前を入力選択してください\n");
scanf("%s", name);
break;
case 2:
printf("年齢を入力してください\n");
scanf("%d", &toshi);
break;
case 3:
while (1) {
printf("仕事を選択してください\n");
printf("学生:1 社会人:2 その他:3\n");
scanf("%d", &jobnum);
if ("jobnum==1||jobnum==2||jobnum==3") {
break;
} else {
printf("正しい数字を入力してください");
}
}
break;
case 4:
printf("メールアドレスを入力してください\n");
scanf("%s", mail);
break;
case 5:
printf("パスワードを入力してください\n");
scanf("%s", pass);
break;
case 6:
   fprintf(outputfile, "%s\n", name);
    fprintf(outputfile, "%d\n", toshi);
   if (jobnum == 1) {
  fprintf(outputfile, "学生\n");
    } else if (jobnum == 2) {
  fprintf(outputfile, "社会人\n");
   } else {
   fprintf(outputfile, "その他\n");    
}
    fprintf(outputfile, "%s\n", mail);
    fprintf(outputfile, "%s\n", pass);    
fclose(outputfile); // ファイルをクローズ(閉じる)
ok = 1;
break;
default:
printf("番号を正しく選択してください\n");
break;
}
} while (ok != 1);
//確認のため出力
printf("名前:%s\n", name);
printf("年齢:%d\n", toshi);
if (jobnum == 1) {
printf("仕事:学生\n");
} else if (jobnum == 2) {
printf("仕事:社会人\n");
} else {
printf("仕事:その他\n");
}
printf("メールアドレス:%s\n", mail);
printf("パスワード:%s\n", pass);
return 0;
}

C言語を初めて日が浅くエラーをなくすことで精一杯で結構長くなってしまいました。これでも一応
エラー自体は無く普通に数字を選択すれば動作するのですが問題は例外処理についてです。
while文を用いたcase3のjobnumや全体のwhile文のconfigはint型なので数字なら違った場合でも例外処理としてループしてくれるのですが文字列が入力されると無限ループが発生します。case2のtoshiについても文字列をいれると無限ループします。
いろいろ試しては見たのですがうまく行かず手詰まりです。
int型に文字列をいれているのが原因だとは重々承知の上でお聞きしたいです。
何かよい解決法はないでしょうか?

この質問とは趣旨が違いますがまだC言語をあまり深く理解できていないためポインタを全く使用せずに書いています。
もしよろしければポインタ使ったほうがいい場所があれば教えていただけたら嬉しいです。

初歩的な質問かとは思いますがどうぞよろしくお願いいたしますm(__)m

何のプログラムかというとファイルに名前、年齢、職業、メールアドレス、パスワードを書き込むプログラムをC言語で作成をおこないました。
仕様としてはあらかじめ入力しておいてそこに一部変更するときに用いるものとして設計しました。
別のところで登録してから変更時にこのプログラムを使う予定ですが今回は予め値を代入しています。
一部変更ということで変更箇所を選択して変更するためswith文を用い、変更箇所が2箇所以上ある場...続きを読む

Aベストアンサー

まぁ、よくあるパターンですな。
初心者がハマるポイントにちゃんとハマっているので心配ありません。

scanf("%d", ほにゃらら)
で、数字以外を入力するとエラー数値にできないのでバッファに残ります。
で、バッファに残ってるデータは次のscanf()等で処理することになります。
戻り値を確認して、よろしくエラー処理して下さい。

>if ("jobnum==1||jobnum==2||jobnum==3") {

ここは直前のscanfa)で何を入力しても真になります。
つまりelseには流れません。
500を入力しようとも…です。
この条件判定は『メモリ上のどこかにある"jobnum==1||jobnum==2||jobnum==3"という文字列の先頭アドレスが0以外か?』という判定です。
文字列定数がアドレス0x00000000に配置される。ということはまずないので、常に真です。

Q※int nyuuryoku_kosuu = 0; ※の部分は何を宣言しているのでしょうか?

#include <stdio.h>
struct tanka_ kosuu {
  構造体名
int tanka;
int kosuu;         型 構造体のメンバ(変数名)
int kingaku;
};
int main()
{
struct tanka_kosuu data [10];
構造体宣言 構造体名  変数名 値・・10を代入
      struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
               型 構造体メンバ(変数名)の初期化
※int nyuuryoku_kosuu = 0;
以上※の部分は何を宣言しているのでしょうか?
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
data [nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
 
以上よろしくお願いいたします。

#include <stdio.h>
struct tanka_ kosuu {
  構造体名
int tanka;
int kosuu;         型 構造体のメンバ(変数名)
int kingaku;
};
int main()
{
struct tanka_kosuu data [10];
構造体宣言 構造体名  変数名 値・・10を代入
      struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
               型 構造体メンバ(変数名)の初期化
※int nyuuryoku_kosuu = 0;
以上※の部分は何を宣言しているのでしょうか?
while(kari_nyuuryoku.tanka != 0){
scanf("%d ...続きを読む

Aベストアンサー

※のところでnyuuryoku_kousuuの初期値を0と置くことで、data[nyuuryoku_kosuu]=kari_nyuuryoku;でkari_nyuuryokuの値をnyuuryoku_kosuuに正しく入れるための宣言だと思います

Qchar gyou[1024];でcharの表現範囲は-128~127間でと!gyou[1024]の

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 以上のプログラムは行数を計算してくれるプログラムです。
  計算結果が
  gyousuu=22 とでます。
 さて、char gyou[1024];でcharの表現範囲は-128~127間ですが、
 gyou[1024]の[1024]とは関係はありますでしょうか!?
  [1024]の意味は”要素数”と参考書に鉛筆書きがありました。
 charの表現範囲である1024は、はるかに超えているみたいですが?
  dharの表現範囲を1024が超えたとしても特に問題はなさそうです!
  このプログラムは動いていますのでは正常です。
  私の
  考え方としまして、何か誤りがありますでしょうか?
  よろしくお願いいたします。

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 以上のプログラムは行数を計算してくれるプログラムです。
  計算結果が
...続きを読む

Aベストアンサー

> さて、char gyou[1024];でcharの表現範囲は-128~127間ですが、
> gyou[1024]の[1024]とは関係はありますでしょうか!?
ない。
1024 のほうはただ単に領域の個数を表しているだけで、読み込もうとするファイルの 1 行のバイト数がこれを超えない限り別に 1000 でも 3327 でも構わない(ある程度以上大きくなると別の問題が出てくるが)。
ただ単に 1024 = 2^10 でプログラマにはよく見る数字、かつ、普通のテキストなら 1 行が収まりそうな長さなだけ。

QC言語でgetchar();が上手く使えずに困っています‼ void input(char *cx,

C言語でgetchar();が上手く使えずに困っています‼

void input(char *cx, char *cy){
int i,x,y;
printf("x=");
*cx = getchar();
if(*cx != 'q'){
for(i = 0; i < 5; i++)
if(*cx == '0' + i)x = i;
}

printf("¥ny=");
*cy = getchar();
if(*cy != 'q'){
for(i = 0; i < 5; i++)
if(*cy == '5' + i)y = i;
}
}

という関数で、一度目は上手く行くのですが、二度目の実行で*cy = getchar();が行われません。
cx,cyは、関数を呼び出す前に'9'を代入しています。

実行されない原因と改善策を教えて下さい‼

C言語でgetchar();が上手く使えずに困っています‼

void input(char *cx, char *cy){
int i,x,y;
printf("x=");
*cx = getchar();
if(*cx != 'q'){
for(i = 0; i < 5; i++)
if(*cx == '0' + i)x = i;
}

printf("¥ny=");
*cy = getchar();
if(*cy != 'q'){
for(i = 0; i < 5; i++)
if(*cy == '5' + i)y = i;
}
}

という関数で、一度目は上手く行くのですが...続きを読む

Aベストアンサー

ついでに言うと、
printf("x=")
のあとで
*cx = getchar();
がキー入力待ちになって見えるのは、たまたまこの時点で標準入力が空だからです。

例えば 432(エンター) と入力したなら、標準入力には
「4」 「3」「2」 「改行」
の4文字が入力され、
*cx = getchar(); で 「4」
*cy = getchar(); で(キー入力待ちにはならずに) 「3」
次に inputが呼ばれたときの
*cx = getchar(); で(キー入力待ちにはならずに) 「2」
*cy = getchar(); で(キー入力待ちにはならずに) 「改行」
となります。

QC++ char配列から char *に変換

最近、Visual C++の環境で、serial通信を習い始めた。

受け取るクラス側に以下のようにメソッド用意されている。
void Serial::sendArray(char *buffer, int len)
{ unsigned long result;

if (serial_handle!=INVALID_HANDLE_VALUE)
WriteFile(serial_handle, buffer, len, &result, NULL);
--
--

呼び出し側で
1.受け取り側クラスのインスタンス作成(以下、comとする)
2.配列作成し、データ3件格納
  char data[] = {0x3C,0x3E,0x3F};
そのデータ配列を
com->sendArray(&data, 3);とうして記述したら怒られた。

エラー内容:
型 char[*][4] の引数は 型 char * のパラメータと互換性がありません。

char data配列の内容をどうやって sendArrayメソッドに渡せばよいでしょうか。
教えてください。
よろしくお願いします。

最近、Visual C++の環境で、serial通信を習い始めた。

受け取るクラス側に以下のようにメソッド用意されている。
void Serial::sendArray(char *buffer, int len)
{ unsigned long result;

if (serial_handle!=INVALID_HANDLE_VALUE)
WriteFile(serial_handle, buffer, len, &result, NULL);
--
--

呼び出し側で
1.受け取り側クラスのインスタンス作成(以下、comとする)
2.配列作成し、データ3件格納
  char data[] = {0x3C,0x3E,0x3F};
そのデータ配列を
com->sen...続きを読む

Aベストアンサー

第1引数のアンパサンド(&)は不要です

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


人気Q&Aランキング

おすすめ情報