• 締切済み

【再確認】C言語のcharとvarcharの扱い

すみません、前回も似たような質問をしましたが、再確認させてください。 例えば、変数1はサイズが256、型がvarchar、値がabcで、変数2はサイズが20、型がcharの場合、 変数1から変数2には値を直接代入できますか? また、代入できた場合、変数2の値はabc+スペース17桁になりますか? 逆に変数2の値がabcの場合、変数2から変数1には直接代入できますか? また、代入できた場合、変数2の値はabc(後ろにスペース等なし)になりますか?

みんなの回答

  • _kappe_
  • ベストアンサー率68% (1522/2216)
回答No.3

他の回答者も書いているとおりC言語の標準にはvarcharなんてありません。どこかの誰かが作ったvarcharについて回答するには、その仕様書とかソースコードが必要です。 >変数1から変数2には値を直接代入できますか? >変数2から変数1には直接代入できますか? どちらもできません。型キャストを使って無理矢理代入したとしても、期待したとおりの動作はしないでしょう。 >代入できた場合、変数2の値はabc+スペース17桁になりますか? >代入できた場合、変数2の値はabc(後ろにスペース等なし)になりますか? そのような動作をするための関数を誰かが作る必要があります。 もし仕事などで「このvarchar型を使え」と指示されているのであれば、その指示者に質問してください。C言語の文字列とvarchar型の間の相互変換のやり方も決まったやり方が用意されているかもしれません。

回答No.2

C言語の標準の型にはvarcharってのは無い。 C言語では、文字列の代入ってのは出来ない。 strcpyとかmemcpyを使います。 強引にキャストするとかして、変数の指しているアドレスを代入する事は可能かも。 オンラインでお手軽にプログラム作れる環境とかもあるし、ちゃちゃっと試した方が、早いし納得できるのでは。 paiza.io https://paiza.io/ja/projects/new

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

C言語に varcharという(用意された)型はありませんし、 「サイズが20で、型がchar」というとcharのサイズが20のように思えますけど(sizeof(char)の値が20に思える)。 まぁC言語で直接代入可能なのは同じ型の場合なので、varcharとcharという時点で直接代入はできませんけど。

関連するQ&A

  • c言語のchar型とvarchar型の関係性

    例えば、構造体で定義したvarcharの値(顧客番号など)をmain関数内から、内部関数のchar*型の引数へ、事前にchar型へ変換することなく渡すことはできるのでしょうか?

  • Pro*CでVARCHAR2項目の検索

    こんにちは。たぶんとても基礎的なことと思うのですが。。。 Pro*CでSELECTするとき、WHERE句の中でVARCHAR2項目を条件に入れています。 が、どうも検索がうまくできなくて質問しました。 ホスト変数の定義…  char VVV[5]; 検索するところ… select xxx into :yyy from ZZZ where ZZZ.varchar2no4BYTE = :VVV ; のような感じです。ZZZ.varchar2no4BYTEの型はVARCHAR2(4)です。 で、ZZZ.varchar2no4BYTE が"1234"と"12"の2つのレコードを 登録しておいて、VVVに"1234"を入れると、ちゃんと検索できました。 んが、VVVに"12"を入れても検索されません。 そんなのあり?と VVVに"12 "を入れてもだめ、 VVVをVARCHAR構造体?にして、"12"で長さ2にしてもだめ、 だけどZZZ.varchar2no4BYTEがCHAR(4)だと"12"でOK、 なんなんだとPro*Cのマニュアル見てもNUMBER型の検索例ばかり、 というところで力尽きました。 (あー、CHAR_MAP=STRING って関係あるですかね) 動的SQLにすればよいのかもしれませんが、事情で使えないのです。 それ以前にホスト変数の理解が間違っているのではないかと思い、 お聞きするしだいです。

  • charの操作について

    お世話になります、フジと申します。 今回皆様にお聞きしたいことは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となってしまい、目的の操作が達成できません。 よい方法をしっている方がいましたら、宜しくお願い致します。

  • Char* に文字列代入

    char* test のように宣言した変数に、 test = "abc" と代入するのは良くないのでしょうか? また、変数test のメモリ領域は、代入時に"abc"の分で固定されるのでしょうか? 使いまわしをしないのであれば、問題ないでしょうか? 何かしら問題がありますでしょうか?

  • char型について質問

    char型は文字コードを保持する型とjavaの解説書に書いてありました。 そして、文字コードは10進数でなく16進数で表すと書いてありました。 でもchar型の変数には10進数も代入できます。これはコンピューターが10進数を16進数に変換しているからですか?

    • ベストアンサー
    • Java
  • c言語でintをchar*に代入

    c言語を用いてマイコンにシリアル通信経由で値を書き込もうとしています. PCからAscii(Aの場合は0x41)でマイコンにデータを送信し,マイコンで static int receivedUART[30]; 上記の変数に格納後し,書き込みのコマンドだと判断した場合に, char *kWifiSsid の変数に書き込みたいと考えています. 以下の関数を作成しました。 void setSSID(int *k){ char ssid[30] = {0}; for(int i = 0;i < SSID_LENGTH;i++){ char t; if(*k == 10){ Serial.println("brek"); break; } t = (char)*k; //最初のに2要素はコマンドのため無視 if((i != 0) && ( i != 1)){ ssid[i-2] = t; } ++k; } kWifiPass = ssid; } 上記の関数の引数にはreceivedUARTを指定しています. しかし,上記ではうまくkWifiPassが書き換えられませんでした. どのように改良すればintの値をchar*に書き込めますでしょうか?

  • c言語 型変換について

    c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1

  • C言語のポインタと配列

    どうにも理解しようとしていますが全体像が理解できないので、わかっていることわからないことまとめていくのでバンバン指摘してくださるとうれしいです。 1.配列の宣言には int a[]; a[] = {1,2,3}ですが、コンピュータは{"1","2","3"}の部分の数を数えて[]に代入しているので、 int [][3] = {{1,2,3},{4,5,6}}のような配列を作ったとき[][3]の部分の左側の数字も勝手に代入している。 この時なぜ3が勝手に代入されないかがわからない 2.数字とメモリ int s = {1,2,3}をメモリ的に表現すると、123の順に並んでいる。s[1]=2 int s[][2] = {{1,2,3},{4,5,6}}をメモリ的に表現すると123456に並んでいる。s[1][1]= 5 ここまで文字列以外の配列は添え字だけで管理されている。 3.文字列とポインタ char s[] = "abc"とするとメモリ的にはabc\0であり、[]には4が代入され、s[1]はb自身を指す。 char *s = "abc"をメモリで表すとabc\0であり、\0が来るまでを文字列と認識する。 sは&s[0]とも表現できるように、最初のアドレスを指し示している。 char *s[]= {"abc","def"}をメモリ的に表現するとabc\0def\0であり、[]には2がコンピュータにより判断されて代入される。\0までを文字列として表現しようとする。s [1] は"def"の最初のアドレスを指し示すが、s[1][1]とするとe自身を指すようになる。この時、s[1] = &s[1][0]と表現することは可能であると考えられる。 文字列を直接さす場合でも、ポインタで表現する場合でも、\0が要素の最後に来るのでしょうか? また、{{"abc","def"},{"ghi","jkl"}}を文字列で直接表す場合は char s[2][2] = {{"abc","def"},{"ghi","jkl"}}; となるかと思いますが char *s[2][2] = {{"abc","def"},{"ghi","jkl"}}; とするとs[1][1]でghiの最初のアドレスを、s[1][1][0]でg自身を表せるようになるのでしょうか?

  • 変数にオフセットが付いている時の計算について

    変数:ABC(負号無し1byte)は「-10」のオフセットがついてます。 (0の時-10という値を表す) 変数:XYZ(負号無し1byte)には「-50」のオフセットがついてます。 (0の時-50という値を表す) この2つの変数を使って、XYZ = ABCの代入処理をする場合ですが、 ABC=100とした時(物理値は90)XYZにこのまま代入すると 物理値は50になってしまうので、XYZのオフセット分に合わせこむ為、 ABCの変数に「40」を加算し「140」にしてから代入すれば良いのでしょうか? 又、ABC = XYZ をやる場合は逆に-40してから代入すればOKでしょうか? ご存知の方おりましたら、教えてくださいお願いします。

  • txtファイルから値の取得方法 [C言語]

    main関数内で使用する変数にtxtファイルから値を読み取り、それを代入する方法を探しております。 以下のようなシステムを製作したいと考えております。 (1)main内で定義した変数 int abc,bcd,cde; (2)hoge.txtの内容が /* txtファイルの中 */ abc 100 bcd 150 cde 200 /* --------------- */ というように記述 (3)mainでhoge.txt内の文字列"abc"を検索し、その後ろにある値100をabcに代入。次に"bcd"を検索し・・・というふうに値を代入していきたいと考えております。 まだ、C言語入門者なので説明不足な点もあるかと思いますが、よろしくお願いします。

専門家に質問してみよう