• ベストアンサー

標準ライブラリ関数の自作について質問です。

C言語初心者の学生です。 標準ライブラリ関数のstrncpyと同じ機能の関数を自作でつくる場合どのようにすれば良いでしょうか。 mystrncpy(char *s1,char *s2,int n) { } かっこの間を埋める形でお願いします。 同じようにstrncat、strnchr、strnstrも答えていただけると幸いです。 すべてではなく4つのうち1つからでも結構ですのでよろしくお願いいたします。

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

  • ベストアンサー
回答No.4

例えば、以下のサイト内を探せば、実装例が出ています。 http://www.bohyoh.com/

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

回答No.6

ひとつだけ。 /* strncpy() C function by Mac OSX * file name: tatt.c * compile: gcc tatt.c * execution: ./a.out */ #include <stdio.h> /* 参照URLに習う */ char *mystrncpy(char *, char *, int); int main(void) { char str1[] = "ABCDEFGHI"; char str2[] = "12345"; mystrncpy(str1, str2, 3); /* (1)s2の長さがn以上のとき */ printf("str1:%s\n", str1); printf("str2:%s\n", mystrncpy(str1, "wxy_z", 4)); mystrncpy(str1, str2, 8); /* (2)s2の長さがnより少ない場合 */ printf("str1:%s\n", str1); return 0; } char *mystrncpy(char *s1, char *s2, int n) { char *temp; temp = s1; while ((*s1++ = *s2++) && --n); return temp; }

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strncpy.html
tattsumii
質問者

お礼

お返事遅れました。 みなさんありがとうございました。

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

strnchrやstrnstrは標準関数ではありませんよ。

全文を見る
すると、全ての回答が全文表示されます。
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

……失礼、書きかけの状態で解答してしまいました。 たとえば、Visual C++では引数が不正な場合は「『パラメータの検証』に説明されているように、無効なパラメータ ハンドラが呼び出され」ますが、そこまで模倣をするのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

で, 何が聞きたいのですか? それぞれの関数の仕様は分かりますか?

全文を見る
すると、全ての回答が全文表示されます。
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

関数の再現度はどのレベルでしょうか。 たとえば、Visual C++では引数が不正な場合は

参考URL:
http://msdn.microsoft.com/ja-jp/library/xdsywd25(VS.80).aspx
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 標準ライブラリ関数

    C言語の勉強を始めたばかりです。 標準ライブラリ関数というのがたくさんありますが、実際のソースをのせているサイトってありませんか?たとえばstrcmpを使わずにアルファベット順に並べ替えるプログラムを作ってみたいのですが。お願いします。

  • 標準ライブラリー関数を使用せずに文字出力

    はじめまして、C言語初心者です。 研修で、C言語を学ぶことになったのですが研修先から頂いた練習問題で「練習のため標準ライブラリー関数は使わない」で文字列を連結するための関数を作ることになったのですが、標準ライブラリー関数を使用せずに文字出力はできるのですか??

  • 自作strcat

    関数strcatを自分で作ってみました。 #include<stdio.h> char *my_strcat(char *s1, char *s2){ int i = 0; int n = 0; while(s1[i] != '\0'){ i++; } while(s2[n] != '\0'){ s1[i] = s2[n]; i++; n++; } s1[i] = '\0'; return s1; } int main(){ char *s1 = "abc"; char *s2 = "vwxyz"; my_strcat(s1, s2); printf("s1:%s s2:%s\n", s1, s2); return 0; } これを実行したところ、s1はちゃんとs1にs2を連結した形で表示されました。しかし、s2は一文字少なく表示されてしまいます。自分ではどこをどう直せばいいかわかりません。よろしくお願いします。

  • ライブラリ関数について教えてください

    C言語を独学で勉強しています。 ファイルの中のデータと配列データが一致するかを調べるプログラムを作ろうとしています。 しかし、私が作っているプログラムでは表示結果が正しくありません。 char型では==を使って一致かどうかを調べることが出来ないので、ライブラリ関数を使う必要があることを知ったのですが、調べてもよくわかりませんでした・・・ どのように作ればいいのか詳しく教えていただけないでしょうか。 よろしくお願いします。 #include<stdio.h> struct test { char no[5]; char name[10]; char english[5]; char math[5]; }; int main(void){ FILE *fp; int i; char f_no[5], f_name[5]; struct test data[5] = { {"001","akemi","100","40"}, {"002","tadao","59","76"}, {"003","mika","94","69"}, {"004","hiroshi","54","98"}, {"005","kazu","39","57"} }; struct test *test_p; test_p = data; if ((fp = fopen("test.txt", "r")) == NULL) { printf("NOT OPEN FILE\n"); } else { while (fscanf(fp, "%s%s", f_no, f_name) == 2) { for(i = 0; i<=5; i++) { if((test_p->no == f_no) && (test_p->name == f_name)) { printf("%s %s 英語%s 数学%sです。\n", f_no, f_name, test_p->english, test_p->math); } else { printf("%s %s 一致しません\n", f_no, f_name); break; } ++test_p; } } } fclose(fp); }

  • main関数について

    最近C言語を勉強し始めた者です。 main関数について分からないことがあるので質問致します。main関数は自作関数ですよね。ということは自由に引数を決めていいのですか?つまり int main(int argc , char *argv[]) 以外の引数を決めることは出来るのでしょうか。

  • システムコールと標準ライブラリの正しい使い方を教えて下さい

    システムコールって何でしょうか。 C言語初心者なので、変な質問だったら、すみません。 システムコールと標準ライブラリにおける、関数の違いを教えて頂けませんでしょうか。 例えばファイル入出力で用いる openとfopenは何が違うのでしょうか? 私はそもそも、システムコールというものが判っていない状態です。 いつも標準ライブラリを参考にしていたものですから・・。 更に似た使い方をすると思いますが、使える範囲等どちらが広いのでしょうか。 よろしくお願いします。

  • C言語の標準関数についての質問です><

    C言語の標準関数についての質問です>< 実行結果が以下のようになるようにプログラムを作りたいのですが・・・・ int indat; ← 用意された変数です。 static char outbuf[101]; ←用意された変数です。 使える標準関数は、 sprintf関数と、strlen関数です。 実行結果 数値入力==>123 数値入力==>45 数値入力==>6789 数値入力==>0 数値入力==>-1 文字列連結=123△45△6789△0 自分なりに書きましたが動きません>< #include <stdio.h> #include <string.h> void main(void) { int indat,i; static char outbuf[101]; i=0; while(indat >= 0) { printf("数値入力==>"); scanf("%d",&indat); sprintf(&outbuf[i],"%d",indat); i=strlen(outbuf); } printf("文字列連結",outbuf); return; } 表示の△は空白です>< どなたか、プログラムを教えてください><

  • ライブラリ関数と同名のメンバ関数

    たとえば、以下のように fclose という メンバ関数を定義し、このクラスの実装のなかで 標準ライブラリ関数 fclose を呼びたいときには どうすれば良いのでしょうか。 別の名前にするというのは無しでお願いします。 #include <stdio.h> class MyFile { public: int fclose(FILE* fp); }; int MyFile::fclose(FILE* fp) { printf("閉じました\n"); fclose(fp); // 標準ライブラリ関数のfcloseを呼びたい return 0; } main() { FILE *fp=NULL; MyFile f; f.fclose(fp); return 0; }

  • atoi関数の自作

    C言語でatoi関数を自作したのですが、正確な答えが出てきません 以下にソースを貼るのでどの当たりを直したらよいのかご教授願います。 1~9までの文字列を一つずつ配列に格納して変換する事を目的として作っています。 実行すると桁あふれしたような値が出てきてしまいます #include<stdio.h> #include<stdlib.h> int pow_10(int m) { int i,prod=1; for(i=0;i<m;i++){ prod=prod*10; } return prod; } ascii2int(char number[]){ int i,j,n[10],num; if(!strcmp(number,"")){ printf("Null string\n"); exit(1); } i=0; while(n[i]!='\0'){ n[i]=n[i]-48; i++; } num=0; for(j=0;j<i;j++){ num=num+n[j]*pow_10(i-1-j); } return num; } main(){ char su[10]; for(;;){ printf("Enter an integar:"); gets(su); if(!strcmp("x",su)){ break; } printf("%d\n",ascii2int(su)); } }

  • 関数がうまく動作しない

    関数get_monthにchar *型の文字列を引数にして、先頭の三文字(大文字でも小文字でも可)が正しいかどうかを関数strnxcmpでチェックしていくものです。 ところが、関数get_month中のreturn iで帰ってくるのはメインプログラムを動作させたところいつも0になってしまっているようです。(本当は1~12が帰ってくるようにしたい。) for(i=1;i<=12;i++) { if(strnxcmp(tuki[i],s,3)==0) { return i;←ここのリターンで0が帰ってきてしまう。 } } } 何がおかしいためにこのようになってしまうのでしょうか? よろしくお願いします。 int strnxcmp(const char *s1,const char *s2,size_t n) { while(n && toupper(*s1) && toupper(*s2)) { if(toupper(*s1) != toupper(*s2)) { return ((unsigned char)*s1 - (unsigned char)*s2); } s1++; s2++; n--; } if(!n)return 0; if(*s1) return 1; return -1; } int get_month(char *s) { int m,i; char *tuki[]={"","January","Feburary","March","April","May","June","July","Augst", "September","October","November","December"}; for(i=1;i<=12;i++) { if(strnxcmp(tuki[i],s,3)==0) { return i; } } return -1; }