• ベストアンサー

strsetという関数

CかC++のプログラムで、文字配列をリセットしたいのでそういった関数を探してみました。 ネットで探したのですが、いくつかのサイトでstrsetという関数が紹介されていました。これは、strset(リセットしたい文字列,入れたい文字)という風に使うようです。 それで実際にソースに書いてコンパイルしたのですが、この関数は定義されてないらしく、認識してくれません。 (インクルードファイルは<stdio.h>,<stdlib.h>,<string.h>を使いました) 確かに聞いたことの無い関数だし、何冊かの本を見ましたがどこにもありません。 この関数はなにか特別な条件でないと使えないのでしょうか?? ちなみに、私がやろうとしたことは char moji[] = "aiueo"と、aiueoが入った文字列mojiの中身を、 strset(moji," ")として空白にしたかったのです。 strsetの他に、文字列の中身を好きな文字で埋められるような関数ってありませんか?ご存知の方、教えて下さい。

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

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

strset って DOS/Windows 系でしか使えないです。 あとは、strset(moji, " " → ' '); の間違いとか?

matuko
質問者

お礼

strsetはUNIX上じゃ動かないって事ですか…どうりで動かないはずです。 だからあまり文献に載ってないのでしょうか。 どうもありがとうございました。

その他の回答 (3)

noname#25358
noname#25358
回答No.3

 補足です。  通常は strcpy ですね。  使い方は、    strcpy( moji, " " );  です。

matuko
質問者

お礼

ありがとうございました。 strcpyを使うと簡単ですね… 参考になりました。

  • ---
  • ベストアンサー率50% (7/14)
回答No.2

#1の訂正と捕捉です。 最初のやつ char* p = moji; while (*p) { *p = ' '; p++; /* 追加 */ } 2番目。 mojiを'\0'で締めましょう。 例えば次のように。 int i, size; size = sizeof(moji); for (i = 0; i < size; i++) { moji[i] = ' '; } moji[size-1] = '\0'; 3番目。 2番目と同様。 memset(moji, ' ', sizeof(moji)-1); moji[sizeof(moji)-1] = '\0'; (memsetってWindowsではないかも?) 訂正だらけで申し訳ありません。

matuko
質問者

お礼

いろいろ考えてくださってありがとうございます。 参考になりました。 そういえばmemsetってありましたね。 C++だけの関数だと勝手に思ってて、Cでも使えるとは知りませんでした。 unix上で動かしてるのでmemsetを使ったらうまくいきました。

  • ---
  • ベストアンサー率50% (7/14)
回答No.1

char* p = moji; while (*p) { *p = ' '; } はどうでしょう? int i; for (i = 0; i < sizeof(moji); i++) { moji[i] = ' '; } でもいいかも。 あるいは memset(moji, ' ', sizeof(moji)); とか。

関連するQ&A

  • str系関数を使わずに二つの文字を結合する方法

    自分で色々考えていたのですが中々分からなくて・・・ #include<stdio.h> #include<string.h> int moji(char* b1,char *b2) { char b[11]; int x; strcpy(b, b1); strcat(b, b2); x = strlen(b); return x; } main() { char a[4] = "alt"; char b[8] = "recorde"; int c; c = moji(a, b); printf("文字数は%d\n", c); } のプログラムでmoji関数の部分にあるstr~を全部接続節(for)等で作成してポイントで持ってきた文字を連結するにはどうすればいいでしょうか? strに慣れて自分で作れなくならないためにもお力をかしいただけると嬉しいです。

  • ソースコードの間違い (C言語)

    変数に、文字列を入れた配列の文字列の最後の要素数を入れたいのですが(つまり'\0')、うまくいきません。いつも2個多い値になってしまいます。 #include <stdio.h> void main() { char moji[100]={0}; int c=0; fgets(moji,sizeof moji,stdin); while( moji[c] != '\0' ) ++c; printf("\n%d\n",c); // } 例えば5文字の1ビット文字を入れると、最後の文字はmoji[4]にあるのでprintfで4と表示されるはずじゃないですか。でも6になるんです。いつも+2の値になるんですよ。どうやらfgetsを使っているからそうなるらしく、scanfを使うと結果は1多い値に、普通に配列に直接文字列を代入すると正常な結果になります。別にcに-2してもいいのですが、それはなんだか癪といいますか・・・。なぜこういうことがおきるのでしょうか?回答よろしくお願いします。

  • 関数の戻り値なんですが...

    VC++を使用し以下のような関数additionで文字列を返したいのですが アドレスしか返しません。配列はその先頭のポインタだということは しっているのですが.... additionは、二つの文字列(32や47などの数字のやつ)を引数とし、そ れを整数型に変換し、その加算を行い、その結果を文字列型に変換し 、その文字列をかえす関数です。 関数の定義などが間違っているのですか?? #include<iostream.h> #include<string.h> #include<string> char *addition(char *,char *); void main(){ using namespace std; char a[] = "1000"; char b[] = "456"; cout << addition(a,b) << '\n'; } char *addition(char *a,char *b){ int c = 0; c = atoi(a)+atoi(b); char p[20]; _itoa(c,p,10); cout << p <<'\n'; return (*p); }

  • C言語のfopen関数について質問です

    fopen関数は #include <stdio.h> がないとコンパイルできませんか? また、第一引数に使えるのは文字列リテラルのみですか?

  • 配列

    こんばんは。 Cを勉強中の者なのですが 前に配列についての内容で自分も分からない事があったので投稿しました。 キーで文字列を入力して関数に渡し、 関数側で引数(文字列データ分)のメモリを確保する事は 出来るのでしょうか。 #include <stdio.h> #include <stdlib.h> void test(char *hiki); int main(void){ char inp[256]; scanf("%s",&inp); printf("%s\n",inp); test(inp); return 0; } void test(char *hiki){ char *i; i = (char*)malloc( ); /* 「hiki」をつかって出来るの でしょうか? */ 全然急ぎとかではなく、ちょっと疑問に思った事なのですが教えていただけるとうれしいです。 (考え方がおかしかったらスミマセン)

  • C言語の関数について教えてください。

    #include <string.h> #include <stdio.h> //すべての文字を表示する関数の定義 void print_all_char(.....) { ..... } int main(void) { char astr[5]; char *pstr; strcpy(&astr[0], "ABCD"); //ポインタpstrが文字列"EFGHI"を指すようにする ..... puts("「配列で実現する文字列」を表示する"); puts(.....); puts("「配列で実現する文字列」のすべての文字を表示する"); print_all_char(.....); puts("「ポインタで実現する文字列」を表示する"); puts(.....); puts("「ポインタで実現する文字列」のすべての文字を表示する"); print_all_char(.....); return 0; } だいたいの流れをプログラムしました。 しかし、.....のところがわかりません。 他の部分にも誤りがあるかもしれませんが、教えてください。 よろしくお願いします。

  • strcat関数のオーバーフロー回避について

    C言語を勉強中の者です。開発環境はWindows7 Visual Studio 2010です。 2つの文字列を入力し、strcat関数を用いて文字列を結合、出力するプログラム を作成しています。文字列は1つの配列につき最大半角5文字です。 本来であれば、char st1[11];ではなく、char st1[6]; としたかったのですが、char st1[6];とすると、strcat関数を実行した際に バッファオーバーフローによるエラーが出てしまいます。 この様な時に、もっと合理的なコードの書き方があれば教えていただけないでしょうか。 よろしくお願いします。 #include <stdio.h> #include <string.h> void main(void) { char st1[11]; char st2[6]; printf("文字列(5文字以内)"); scanf("%s", st1); printf("文字列(5文字以内)"); scanf("%s", st2); strcat(st1, st2); printf("%s", st1); }

  • 関数の作り方

    文字列s1に文字列s2が含まれるか判定する関数search を作りたいのですが、コンパイルできません。 どこに問題がありますか?? #include<stdio.h> #include<string.h> int seach(char *s1,char *s2) { char *p; p = strstr(s1,s2); if(p == NULL){ return 0; }else{ return 1; } } main(void){ char s1[255]; char s2[255]; int res; printf("文字列s1を入力:"); scanf("%s",s1); printf("文字列s2を入力:"); scanf("%s",s2); res = search(s1,s2); if(res == 1){ printf("文字列s1に文字列s2が含まれます\n"); } if(res == 0){ printf("文字列s1に文字列f2は含まれません\n"); } return 0; }

  • ヘッダファイルに関数本体を書き込めないのか?

    こんにちは。 現在WindowsVistaでCおよびC++を使ってプログラミングを行っています。 最近になって思ったのですが、普通、ヘッダファイルに記述する内容は、 ・関数のプロトタイプ ・クラスのメンバ関数を除いた部分(いわゆる「クラスの骨格」) ・マクロ といったものだと言われています。 そして、関数の実態やクラスのメンバ関数などは、 別のソースファイルに記述するように言われています。 なぜ、ヘッダファイルに関数の実態や、クラスのメンバ関数を記述するべきではないでしょうか? あるいは、プログラムの内容に応じて、関数やクラスの内容を、 ヘッダファイルにまるごと記述してもよい場合と悪い場合があるのでしょうか? こういった事について、何か御存じの方がいらっしゃれば、是非アドバイスをお願い致します。 (難しい問題なので、なるべく詳しい説明を頂けると、大変助かります。) ちなみに、関数やクラスのメンバ関数も一緒に、クラスの内容をまるごとヘッダファイルに記述しても、 今までの所、全く問題なく動作しています。 例えば、以下のようなプログラムは、何の問題もなく動作します。 ●main.c ____________________________________________________________ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include "func.h" void main(void) { char str[80]; puts("文字列を入力せよ"); gets(str); func(str); } ____________________________________________________________ ●func.h ____________________________________________________________ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> void func(char *p) { puts("入力された内容は以下の通り。"); while(*p) putchar(*p++); } ____________________________________________________________

  • 関数へ引数を渡す時・・・(C言語)

    Cを始めたばかりです。 レベルの低い質問だと思いますがお願いします。 【ソース】 /* a1.c */ #include <stdio.h> void aaa(char); int main( int argc, char *argv[] ) { char box[] = "test"; aaa(box); return 0; } /* a2.c */ #include <stdio.h> void aaa(char box) { printf( "%s",box ); } 【質問】 変数boxの中身を関数aaaに渡したいだけですが、 上記ソースをコンパイルすると、a1.cの aaa(box) の部分でエラーが出てしまいます。 どうもデータ型(ポインタ?)がまずいようですが、 何が問題なのでしょうか? 御回答宜しくお願い致します。

専門家に質問してみよう