• 締切済み

c言語の文字列出力

プログラミング超初心者です サイトで文字列の出力について調べていたところ c言語は変数に文字列を代入することができないのでstrcpy関数を使い以下のようにするとあります char s[5]; strcpy(s, "ABCDE"); printf("%s\n", s); ところが他のサイトでは以下のように説明しています char s[5] = "ABCDE"; printf("%s\n", s); 明らかに後者の方が簡単で良いように見えるのですが違いはなんですか? あと、文字列の配列の指定?の[5]の部分なのですが 数字を記載しているところがほとんどですが省略しているところも有ります どんな文字列が入るかわからない場合もありますがここは省略しない方が良いのですか? よろしくお願いします

みんなの回答

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.3

前者はstrcpy()の使い方の簡単なサンプルだからかと。 strcpy()の使い方のサンプルなのにstrcpy()が使われていなかったら意味ないでしょ? >数字を記載しているところがほとんどですが省略しているところも有ります どんな文字列が入るかわからない場合もありますがここは省略しない方が良いのですか? >char s[] = "ABCDE"; のように変数定義の段階でABCDEと'\0'で6バイトと明確で、そのバイト数で良い場合には省略できます(末尾の'\0'が不要な場合には省略できません)。 質問での前者のように必要なサイズが不明の場合には省略できません。

ashitanotenki11
質問者

お礼

strcpy()の使い方の説明ではなく文字列の出力の説明でしたね あとscanf()などから取り込む場合は何文字入るか解らないけどそういう場合はどうするのですか? とにかくサンキューチェケラッチョです!

ashitanotenki11
質問者

補足

よく読んだらcharの配列のところにも同じ説明がありました strcpy()の説明だったようですね Googleで検索して出てきたのをそのまま読んでたチェケラッチョですよ!

  • kteds
  • ベストアンサー率42% (1875/4423)
回答No.2

後者はコンパイル時に配列の要素を初期化している。 前者は実行時に代入している。 --- 配列の要素数を指定しない場合は自動的に要素数を決めてくれる。

ashitanotenki11
質問者

お礼

どっちが効率が良いとかあるのですかね? 自動で決めてくれるのにわざわざ指定する意味がC言語初めて2日の人間には理解できてないんですよね このような小学生の国語の問題でも不完全でマルが貰えないような解答ではバッテンですね でもとにかくサンキューチェケラッチョですよ!

  • catpow
  • ベストアンサー率24% (620/2527)
回答No.1

まず、質問に書かれているC言語のソースは間違っています。 char s[5];ではなく、char s[6]; にすべきです。6以上で、char s[20];としてもいいですけどね。 このままだと、データ領域外への書き込みが発生します。 >>明らかに後者の方が簡単で良いように見えるのですが違いはなんですか? やっていることは同じと考えていいと思います。 ソースを簡単に書けるように、後者の書き方も認められるように文法を拡張したのだと思いますね。 >>あと、文字列の配列の指定?の[5]の部分なのですが 数字を記載しているところがほとんどですが省略しているところも有ります これも同じく、「できるだけ楽にソース書きたい」っていう要望に合わせて、省略もOKな文法に拡張したのだと思います。

ashitanotenki11
質問者

お礼

数字を[5]にしたのは無知な私の間違いです\0が入るから6なのですよね このような間違いを起こさないためにも[]の方が良かったわけですね サンキューチェケラッチョです!

関連するQ&A

  • 文字列の途中に「0」がある場合の文字出力について

    C言語初心者です。宜しくお願い致します。 char ss[10]; /*【1】0ナシの文字列*/ strcpy(ss,"abcdefg"); printf("%s\n",ss); /*【2】0アリの文字列*/ strcpy(ss,"abc0efg"); printf("%s\n",ss); /*【3】0アリ(NULL文字アリ)の文字列*/ strcpy(ss,"abc\0efg"); printf("%s\n",ss); 【2】、【3】の文字列を最後(~fg)まで出力させるには、 どうしたら良いのでしょうか。 (0や¥0を、文字情報の一部として扱いたい場合、という意味です。) 宜しくお願い致します。

  • 配列やポインタに文字列を設定することについて

    ◎1------------------------- #include<stdio.h> int main(void) { char ss[80]; scanf("%s",ss); printf("%s\n",ss); return 0; } ---------------------------- ◎2--------------------------- #include<stdio.h> int main(void) { char *ss="abcde"; printf("%s\n",ss); return 0; } ------------------------- ◎3---------------------- #include<stdio.h> int main(void) { char *ss; ss="abcde"; printf("%s\n",ss); return 0; } ------------------------- 以上3つプログラムで疑問をいだいたのですが、 まず◎1で、これは例えば、 cahr ss[80]="abc"; のように配列ssに文字列"abc"そのものを入れているのか、 char *ss="xyz"; のようにまず"xyz"という文字列をメモリ上のどこかに設定し、その先頭番地をssに代入しているのか、どちらの考えでいいのかわかりません。 次に、◎2、3ではどちらも正常に実行できたのですが、特に◎3で「ss="abcde";」と記述していますが、ssにはアドレスを代入するという認識かあるのですが、文字列定数を代入しても問題ないのか?という疑問があります。 教えていただけたら嬉しいです。

  • 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); }

  • 文字列を表すための配列とポインタ

    文字列を表すための配列とポインタ  配列とポインタは同様に扱えるもの、と思って、次のプログラムを作りました。処理系は、Visual Studio 2010 コマンドプロンプトです。 #include <stdio.h> void main(void) { char a[256]; char *b; printf("文字列を入力してください。\n"); printf("例「abcde」\n\n"); printf("配列型文字列を使います。\n"); scanf("%s", a); printf("文字列は%sです。\n\n", a); printf("ポインタ型文字列を使います。\n"); scanf("%s", b); printf("文字列は%sです。\n", b); }  すると、まずコンパイル時に、 「warning C4700: 初期化されていないローカル変数'b'が使用されます」 と表示されました。そして、実行すると、「配列型文字列」の方は問題ないのですが、「ポインタ型文字列」の方の実行後に、 「x.exeは動作を停止しました。 問題が発生したため、プログラムが正しく動作しなくなりま した。プログラムは閉じられ、解決策がある場合は Windowsから通知されます。」 と表示され、エラーとして終了してしまいます。 「char *b;」 と宣言するところが問題のようですが、なぜなのかが分かりません。どなたか、解説をお願いします。

  • C言語の文字列の取り扱いが分かりません

    こんにちは。 C言語で分からないことがあり、質問させていただきました。 学校で、文字列の取り扱いを習いました。 そこで質問なんですが、以下のソースコードをstrcpy , strcat , strcmp , strlen を使わずに書くことってできないですか? 先生に質問したところ、ポインタとかいうのを使うのだそうですが、それを使わずに書くことってできるんですか?もしよろしければお願いします。 以下のプログラムですが、ユーザーから2つの文字列を受けて、そこから4つの文字列関数を使ってみましょう、というやつです。実行結果も貼っておきますね。 #include <string.h> #include <stdio.h> int main(void) { char str1[80], str2[80]; int i; printf("INPUT 1st word-line. : "); gets(str1); printf("INPUT 2nd word-line. : "); gets(str2); /*文字列(word-line)の長さを確認します。*/ printf("%s is %d moji long.\n", str1, strlen(str1)); printf("%s is %d moji long.\n", str2, strlen(str2)); /*文字列を比較します。*/ i = strcmp(str1, str2); if (!i) printf("two word-lines are same length.\n"); else if (i < 0) printf("%s is smaller than %s.\n", str1, str2); else printf("%s is bigger than %s.\n", str1, str2); /*十分なスペースがあるのなら、str2をstr1の最後に結合させます。*/ if((strlen(str1) + strlen(str2)) < 80 ){ strcat(str1, str2); printf("%s\n", str1); } /*str2をstr1にコピーする*/ strcpy(str1, str2); printf("%s %s\n", str1, str2);

  • 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; }

  • C言語 文字列の比較 compare

    プログラミング初心者です。 60文字以内の文字列を入力して、 大小関係を比較・表示するプログラムなのですが・・ 「AはBより大きい」という結果しか出ません。 どこが間違っているのか、ご指摘お願いしますっ。 #include<stdio.h> int main(void) { char moji1[61]; char moji2[61]; printf("文字列Aを入力===>"); scanf("%60s" ,&moji1); printf("文字列Bを入力===>"); scanf("%60s" ,&moji2); if(moji1-moji2>0){ printf("===AはBより大きい===\n"); } else if(moji1-moji2<0){ printf("===AはBより小さい===\n"); } else if(moji1-moji2==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y){ if(*x=='\0') return 0; x++; y++; } return (*x-*y); }

  • 文字列での代入 (C言語)

    こんにちは。 C言語を勉強しているのですが、どうしても分からないことがあるので質問しました。 まず下記のソースを見てください。 #include <stdio.h> int main() { char* moji; moji = "right Test \n"; printf(" moji = %s\n", moji); moji = "dot 255 left up down \n"; printf(" moji = %s\n", moji); getchar(); return 0; } char* mojiがメモリを取らずに代入できているのですがこういった事が可能なのは何故でしょうか? その後もmojiの変数を別の文字列定数で書き換えています。 こういったことはできなかったはずなんですがどうしてでしょうか? 自分の開発環境だとVS.2005 VC++です。 よろしくおねがいします。

  • C言語

    以下のプログラミングについて。 #include<stdio.h> int main(void) { char ss[6]="ABCDE"; printf("ss[0]=%c\n",ss[0]); printf("ss[1]=%c\n",ss[1]); printf("ss[2]=%c\n",ss[2]); printf("ss[3]=%c\n",ss[3]); printf("ss[4]=%c\n",ss[4]); printf("ss[5]=%c\n",ss[5]); printf("ss=%c\n",ss); return 0; } 以上のプログラミングの出力は、 ss[0]=A ss[1]=B ss[2]=C ss[3]=D ss[4]=E ss=ABCDE となると思うのですが、あってますか? また、 printf("ss[5]=%c\n",ss[5]); は、char文でいうとヌル(ナル)文字の\0の部分に相当すると思うのですが、printf("ss[5]=%c\n",ss[5]);の出力制御はどうなるんですか? ご教授願います。

  • ポインタにによる値の表現と文字列の表現について

    ◎1------------------------------ #include<stdio.h> int main(void) { char *pt="ABC"; printf("pt=%s\n",pt); char dt[10]="ABCDE"; char *pp; pp=dt; printf("pp=%s\n",pp); return 0; } -------------------------------------- ◎2---------------------------------- #include<stdio.h> int main(void) { char *pt="ABC"; printf("*pt=%s\n",*pt); char dt[10]="ABCDE"; char *pp; pp=dt; printf("*pp=%s\n",*pp); return 0; } ----------------------------------- ◎3--------------------------------------- #include<stdio.h> int main(void) { int ary[5]={111,222,333,444,-1}; int* pt=ary; while(1){ printf("%d ",*pt); ++pt; if(*pt==-1){ break; } } puts(""); return 0; } ----------------------------------------------- 以上3つのプログラムで、◎1はprintfで「*」が付いてなく、正常に実行出来ました。 ◎2はprintfで「*」が付いてなく、エラーは出ませんが、文字列が表示されませんでした。 ◎3は文字列ではなく値ですが、printfで「*」が付いていて正常に実行できます。 これは、値の場合は「*pt」とすることで、ptのアドレスに値を代入しているという事で、「printf("%d ",*pt);」で実行できたということですかね? 文字列の場合は、先頭のアドレスを渡すだけなので、「printf("pt=%s\n",pt);」のようにしてアドレスを参照しないとダメであるということですか? ◎2で「printf("*pt=%s\n",*pt);」としてしまうと、何が起きてしまうのかわかりません。 以上、教えていただけると嬉しいです。