アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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関数はご自分で作成してみて下さい。→出題かな。
・以上。もし良かったら上記の関数を使って下さい。
    • good
    • 0

典型的な方法としては、



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がそれにあたるかと思います。
    • good
    • 0

Cは文字列を言語仕様として持っておらず、それを一意に扱う関数も少なく、MIDやMID$に相当する関数はありません(作っても多寡がしれているので多用する場合はすぐ作れる)



元の文字列を残したければ、先頭をオフセットしてからstrndupかstrncpy(前もって用意しておく場合)

char *string = "abcdef";
char *output;

/* MID(string,3,2) */
output = strndup(string+2,2);

壊れて良いなら、

string+2;
*(string+2) = NULL;

どちらか使いたいほうでどうぞ
    • good
    • 0

>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/ …
    • good
    • 0

char *aaa = "abcdefghi";


char bbb[5] = {0}; /* 4 文字分+ヌル文字分 */

strncpy(bbb, aaa + 2, 4); /* C言語では0から始まるから */

てな感じ?
    • good
    • 0

Cでは文字「列」変数というのは存在しない。


文字変数の配列となる。
よってMID$に相当するものは手で作る他ない
    • good
    • 0

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