• 締切済み

エクセルのMID関数は、C言語では?

最近C言語を始めたものです。 エクセルでは文字列の3文字目~5文字目を切り取る際に MID("文字列",3,2) と記述できますが、C言語の場合、はどのような記述方法になりますか?ご教授お願いいたします。 いま悩んでるのが、CHAR型の変数:aaaに"abcdefghi"を格納して、 aaaの3文字目~7文字目を抜き出したいというC言語での方法です。

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★2つ関数を紹介します。 ・たくさんのアドバイスと回答があるので VBA の MID と LEFT 関数と同じ機能を紹介します。 ●MID関数 char MyStrMid( char buff[], const char string[], int pos, int len ) {  char *dest = buff;    if ( pos < strlen(string) ){   for ( string += pos ; len > 0 ; len-- ){    if ( *string == '\0' ){     break;    }    *dest++ = *string++;   }  }  *dest = '\0';  return( buff ); } ●LEFT関数 char MyStrLeft( char buff[], const char string[], int len ) {  return( MyStrMid(buff,string,1,len) ); } ●書式 ・MyStrMid( 抽出文字列領域, 文字列, 抽出開始位置, 抽出バイト数 );  戻り値は『抽出文字列領域』へのポインタを返します。 ・MyStrLeft( 抽出文字列領域, 文字列, 抽出バイト数 );  戻り値は『抽出文字列領域』へのポインタを返します。 ●使い方 char buff[ 5 + 1 ]; ←抽出用のバッファ領域(サイズは『取り出す文字数+NULL文字分』以上を指定) char aaa[] = "abcdefghi"; ←C言語には文字列型がないので char 型の配列にする MyStrMid( buff, aaa, 3, 5 ); ←3文字目~7文字目を抜き出す printf( "buff=[%s]\n", buff ); 最後に: ・上記の2つの関数でエクセル(VBA)の MID と LEFT と同じ処理を行えます。 ・注意事項として MyStrMid、MyStrLeft 関数の引数に NULL ポインタを渡したときの対策はしていません。  このため NULL ポインタを渡さないことが絶対条件です。安全性を高めるには引数に NULL ポインタが  渡されたときの処理を追加して下さい。→上手に改良してね。 ・VBA の RIGHT関数はご自分で作成してみて下さい。→出題かな。 ・以上。もし良かったら上記の関数を使って下さい。

すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

典型的な方法としては、 char aaa[] = "abcdefghi"; char s[3]; strncpy(s, aaa + 3, 5); または wchar_t aaa[] = L"abcdefghi"; wchar_t s[3]; wcsncpy(s, aaa + 3, 5); ですね。 C++なら、std::basic_string<>::substrがそれにあたるかと思います。

すると、全ての回答が全文表示されます。
  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.4

Cは文字列を言語仕様として持っておらず、それを一意に扱う関数も少なく、MIDやMID$に相当する関数はありません(作っても多寡がしれているので多用する場合はすぐ作れる) 元の文字列を残したければ、先頭をオフセットしてからstrndupかstrncpy(前もって用意しておく場合) char *string = "abcdef"; char *output; /* MID(string,3,2) */ output = strndup(string+2,2); 壊れて良いなら、 string+2; *(string+2) = NULL; どちらか使いたいほうでどうぞ

すると、全ての回答が全文表示されます。
  • ballville
  • ベストアンサー率47% (233/487)
回答No.3

>CHAR型の変数:aaaに"abcdefghi"を格納して char型の変数には文字列を入れられません。 char *型の変数に文字列へのポインタを入れることになります。 #include <string.h> char *aaa = "abcdefghi"; char bbb[ 256 ]; strncpy( bbb, aaa + ( 3 - 1 ), 7 - ( 3 - 1 ) ); bbb[ 7 - ( 3 - 1 ) + 1 ] = '\0';

参考URL:
http://www005.upp.so-net.ne.jp/h-masuda/cl/CLib/clib03.html,http://homepage2.nifty.com/sak/w_sak3/doc/syspc/c_k06.htm
すると、全ての回答が全文表示されます。
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.2

char *aaa = "abcdefghi"; char bbb[5] = {0}; /* 4 文字分+ヌル文字分 */ strncpy(bbb, aaa + 2, 4); /* C言語では0から始まるから */ てな感じ?

すると、全ての回答が全文表示されます。
noname#39970
noname#39970
回答No.1

Cでは文字「列」変数というのは存在しない。 文字変数の配列となる。 よってMID$に相当するものは手で作る他ない

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • G6030プリンタで液晶画面にファームウェアデートが表示されるが、ダウンロードしても何も表示されない
  • LAN・USB両方で試したが、同様の結果になる
  • キヤノン製品のファームウェアデートに関して、方法を知っている方、教えてください
回答を見る

専門家に質問してみよう