• ベストアンサー

文字列の関数引渡しについて

呼び出す関数が int sample(char *moji)となります。 呼び出しもとで1、2と記載するのは正しいのでしょうか? 1. char *c[SIZE]; *c = DialogBox1->FileName.c_str(); /*FileNameは abcde */ sample(*c); 2. sample("abcde"); 3. char *c[SIZE]="abcde"; sample(c); 4. char *c[SIZE]; c = "abcde"; sample(c); 呼び出す関数にはアドレスを渡すものと思っているのですが 3や4は正しいのでしょうか? また間違っているものやおかしい使い方などが あれば教えていただけないでしょうか。 それぞれの番号の処理について教えていただければ 幸いです。

noname#25605
noname#25605

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

ちょっと勘違いされているようですね。 char c[SIZE]; C言語の文字列は文字の配列です。文字列を格納するには、配列を使います。SIZEバイト分のメモリが確保され、そこに文字を入れることが出来ます。 char *c; ポインタで宣言すると、確保されるメモリはアドレスを格納するための4バイトです。これに直接文字を格納することは出来ません。ポインタは他の変数を参照する為のものですから、文字列は別のところでメモリを確保し、格納する必要があります。 char *c[SIZE]; この宣言は、ポインタの配列になります。確保されるのはアドレスを格納するための4バイト×SIZEで、上記のポインタと同様、文字列を格納する為のメモリは確保されていません。 上記をふまえ 1. char *c[SIZE]; これはポインタの配列です。 *c = DialogBox1->FileName.c_str(); /*FileNameは abcde */ *cはc[0]と同じで、ポインタの配列の一番目の要素を指します。 DialogBox1->FileName.c_str()から返される文字列へのポインタを、ポインタの配列の一番目の要素に代入しています。 sample(*c); 上記と同様*cはc[0]と同じで、ポインタの配列の一番目の要素です。 ここには先ほどの文字列へのポインタが代入してあるので、それを関数へ渡しています。 きっと、勘違いして使っていますが、正常に動くと思います。 2. sample("abcde"); 静的に確保されている文字列の先頭アドレスを渡しています。問題ないです。 3. char *c[SIZE]="abcde"; コンパイルエラーです。ポインタの配列なので、文字列では初期化できません。 4. char *c[SIZE]; c = "abcde"; 文字列の話とは関係なく、配列で宣言されている変数に、直接値を代入すること自体がエラーになります。 5. char c[SIZE]; c = "abcde"; これもエラーになります。4.と同じです。静的に確保されている配列のアドレスを変更することは出来ません。 6. char c[SIZE] = "abcde"; sample(c); しかし、これはOKです。配列に初期値を代入している事になります。ややこしいですね。(^^;

noname#25605
質問者

お礼

ご回答ありがとうございます。 すごくわかりやすくて勉強になりました。

その他の回答 (3)

  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.4

既に質問への回答は他の方がなさっていますので、 別なアプローチとして。 過去の質問から察するにビルダーをお使いですか? もしそうであれば老婆心ながら、文字列の処理はAnsiStringを使うと便利ですよ。 AnsiStringの使い方はHELPを参照してください。 C/C++の学習の為の質問であるなら、全く見当違いの回答ですが・・・

noname#25605
質問者

お礼

ご回答ありがとうございます。 AnsiStringも現在勉強中です。 ご指摘ありがとうございます。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

1,3,4はコンパイルエラーになりませんでしたか? 1.は  char *c;  c = DialogBox1->FileName.c_str();  sample(c); なら話は分かります。 2.はOK。問題なし。 3.は、  char c[SIZE]="abcde";  sample(c); なら納得できます。 4.は、  char *c = "abcde";   sample(c); なら可能。sample(c)の中で変数c をいじられたくないので、 const char *c = "abcde"; のほうが安全。

noname#25605
質問者

お礼

ご回答ありがとうございます。 またまた質問になりますが 宣言時に  char *c = "abcde"; と記載するのと  char *c; c = "abcde"; は同じことなのでしょうか?

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> char *c[SIZE] が勘違いしている様に思われ。これですと「char型ポインタの配列」を定義している事になります。 1~4についてあっているところもあれば間違っているところもありますが、そういうのは実際にコンパイラに通してみれば、一発でわかりますので、そこででたエラーメッセージについて調べる方が学習効果が高いと思います。

noname#25605
質問者

お礼

ご回答ありがとうございます。 いろいろ調べてみます。

関連する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言語の勉強をしております。 そこで、以下の関数の作成について質問させてください。 【関数の仕様】 引数の文字列から、'-'(ハイフン)と'P'以降を排除した文字列を返す。 自分なりに作成してみたのですが、コンパイルで警告が出てしまう状況です・・・。 もっとスマートに書けるんだろうとは思っているんですが、精一杯でした・・・。 どなたか教えていただけませんでしょうか? char *getDelStr(char *str) { int len = strlen(str); int count; char targetStr[32]; for(count = 0; count < len; count++){ if(str[count] != 'P'){ if(str[count] != '-'){ strcat(targetStr,str[count]); } }else{ return targetStr; } } return str; } 以上、よろしくお願いいたします。

  • 文字列の扱い方

    初歩的な質問ですみません… str文字列からcという文字を見つけたら添字を返すという関数を作ったのですが、 iにこの関数を代入して、if文の制御式にiを使って比較するまでは正常なのですが、 真文にiを使うと何故か偽文(という言い方でいいのでしょうか…この場合("そんな値はありません。"というところです)が実行されてしまいます。 よろしければご教授お願い致します。 #include <stdio.h> int str_char(const char str[],int c) { int len = strlen(str); int i; for (i = 0;i < len;i++) { if (str[i] == c) return i; } return -1; } int main() { char str[64] = "Fucking Brutal Death Metal"; int ch,i; printf("どの文字を調べますか?"); scanf("%c",&ch); i = str_char(str,ch); if (i >= 0) printf("その文字は%d番目にあります。",str_char(str,ch) + 1); //何故かiだと動かない else printf("そんな値はありません。"); return 0; }

  • mainから渡した文字列を関数内で書き換え

    非常に基礎的な質問で申し訳ないのですが mainから渡した文字列を関数内で書き換えることができません。 int型の整数やchar型一文字はできるのですが。。。 例えば以下のようなソースでmainのABCをDEFに書き換えたいとき どのようにすればいいのでしょうか。 (関数の戻り値で変更という方法以外で) 以下のソースでは値は書き換わりませんでした。 void func(char *str2) { str2 = "DEF"; } int main() { char str1[20] = "ABC" printf("%s", str1); //ABC func(str1); printf("%s", str1); //DEFになるようにしたい }

  • 文字列を関数に渡すぷろぐらむなのですがおかしいです。

    <ソース> #include<stdio.h> #include<stdlib.h> void str(char a[]); int main() { char st[10]="abcde"; str(st); str("ABCabc123"); return 0; } void str(char a[]) { int i; printf("%s\n",a); i=0; while(a[i]){ a[i]=toupper(a[i]); putchar(a[i]); i++; } putchar('\n'); } 分からないところがあるので質問します。 toupperは、大文字にするんですよね。 putcharは、基本的にchar型でしたっけ? putsとgetsは、int型でしたっけ? 後、プログラムが暴走してます。 どこがおかしいんでしょう?

  • C言語 文字列操作

    トリム関数とリムーブ関数を作成してみました。改良点はありますでしょうか? ~~~~以下ソース~~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> char *Trim(char *str); char *Remove(char *str, char *rmv); void main(void) {  char str[10], rmv[10], *p;  int c;  /* " abcd "をトリムする */  strcpy(str, " abcd ");  printf("トリム前 |%s|\n", str);  p = Trim(str);  printf("トリム後 |%s|\n", str);  /* 指定文字列を削除する */  printf("削除する文字列を入力してください :");  scanf("%s", rmv);  Remove(str, rmv);  printf("削除後 |%s|\n", str);  exit(0); } char *Trim(char *str) {  char space[] = " ";  char null[] = "";  int index = 0;  while(1){   if(strcmp(&(str[index]), null) == 0){    index--;    if(strncmp(&(str[index]), space, 1) == 0){     strcpy(&(str[index]), &(str[index]) + 1);    }else{     break;    }   }else{    if(strncmp(&(str[index]), space, 1) == 0 && index == 0){     strcpy(&(str[index]), &(str[index]) + 1);    }else{     index++;    }   }  }  return str; } char *Remove(char *str, char *rmv) {  int c, size, i;  char *p;  c = '\0';  p = strchr(rmv, c);  size = p - rmv;  for(i = 0; i < size; i++){   c = (int)rmv[i];   p = strchr(str, c);   if (p != NULL) {    strcpy(&(str[p-str]), p + 1);   }   else{    printf("""%c""は見つかりませんでした\n", c);   }  }  return str; }

  • 文字列リテラルの比較について

    下記のプログラムの疑問点を教えて頂きたい。 (1)mainの実引数(ch[0]は、str_chr関数を呼ぶ場合、intの型変更する理由、 (2)cをキヤストしてchar 型変更した後、再度int C に代入する理由 (3)char型*Sとint 型Cでは、型が違うのに何故比較できる理由 char *str_chr(const char *s, int c) { c = (char)c; while (*s != c) { } main { char ch[2]; str_chr(G,ch[0]) main {

  • 文字列のコピー

    C言語で、文字列をコピーする関数で、処理が止まってしまいます。 以下が実行したプログラムです。 #include<stdio.h> #include<string.h> void copy(char *str2 ,char *str3){ strcpy(str2,str3); } void input(char* str){ scanf("%s",str); } int main (void){ char *a; char *b="TEST"; printf("%s\n",b); input(a); copy(b,a); printf("%s",b); return(0);} copy(b,a);で処理が止まってしまいます。入力した文字列を表示できるように、御指摘お願いします。

  • 文字列をint型にキャスト

    文字列をunsigned int型キャストし,それをある演算をして 正の整数に変換したいのですがどうすればいいですか? int ca(char *s) { unsigned int h; int key; h = (unsigned int)s; //文字列を演算し 0~254 の整数にする// key = h % 254; return key; } int main() { char moji[32]; moji = "moji"; unsigned int c; c = ca(moji); }

  • C言語での文字列ソート動作について

    任意の文字列を入力し、その文字列を昇順にソートするプログラムを作ったのですが、入力する文字の文字数が大きく異なると期待した結果が得られません。 文字数が少なくなったり、他の配列の文字が混ざったりと言う結果に成ってしまっています。 何が原因か分からない状態です。 以下にサンプルを記載させて頂きますので、助言よろしくお願いします。 /*----------------------------------------- 入力例 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBB AAAAAA -----------------------------------------*/ #include <stdio.h> #include <string.h> #include <stdlib.h> void swapc(char *cx , char *cy){ char tmp[100]; strcpy(tmp, cx); strcpy(cx, cy); strcpy(cy, tmp); } int main(){ char *num[100]; char str_tmp[100]; //文字列一時格納 int moji_cnt; //入力した文字列のカウント int n , m; // 文字列入力処理開始 printf("文字列を入力してください\n"); for( moji_cnt = 0 ; moji_cnt != 3 ; moji_cnt++){ scanf("%s", str_tmp); *(num+moji_cnt) = (char *)malloc(sizeof(char) * (strlen(str_tmp)+1)); //メモリ確保 strcpy(*(num+moji_cnt), str_tmp); } puts("\n"); // 文字数ソート処理 for(n = 0 ; n < moji_cnt-1 ; n++){ for(m = 1 ; m < moji_cnt-n ; m++){ if(strcmp(*(num+n) , *(num+n+m)) > 0){ swapc(*(num+n) , *(num+n+m)); // 文字列入れ替え } } } puts("\n"); for(n = 0;n != moji_cnt;n++){ printf("%s\n" , *(num+n)); } free(num); }

専門家に質問してみよう