• ベストアンサー

main関数以外での文字列の表示はどうやるの?

//を外すとエラーも警告も無くコンパイルはできるのですが、実行すると「エラーが発生したため終了します。「エラー報告を送信する」「送信しない」」という画面になり、それ以上できません。 なぜなんでしょうか。 //void dis(char *b){ //     printf("%s\n", *b); //} void main(){      char a[] = "pipi"; //    dis(a);      printf("%s\n", a); } どなたか教えていただけないでしょうか。お願いしますm(_ _)m

  • dra2jp
  • お礼率27% (168/613)

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

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

dis()関数内での、b の使い方が間違っています。 printf() における "%s" 指示子には文字列へのポインタを指定しなければなりません。 アナタの書き方だと、ポインタbが指している文字を printf() に渡していますが、printf()はソレが文字列へのポインタであると解釈して、ポインタの中身を見ようとします。しかし、アナタが渡した文字の値の範囲は-128-127であり、そんな低位アドレスへアクセスすることはできませんので、結果セグメント違反を起こしてクラッシュするのです。 printf("%s\n", b) と書いてください。

dra2jp
質問者

お礼

ありがとうございました!!とても参考になりました!

その他の回答 (2)

回答No.2

次のひとです(笑) ポインタは宣言は*var,使用はvarの形になります。 使用するときに*varとすると,ポインタの指している値の参照になります。

dra2jp
質問者

お礼

ありがとうございました!!とても参考になりました!

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

printf("%s\n", *b); を、 printf("%s\n", b); にしてください。 理由は、、多分、次の人が説明してくれるでしょう。

dra2jp
質問者

お礼

ありがとうございました!!とても参考になりました!

関連するQ&A

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

    文字列を表すための配列とポインタ  配列とポインタは同様に扱えるもの、と思って、次のプログラムを作りました。処理系は、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;」 と宣言するところが問題のようですが、なぜなのかが分かりません。どなたか、解説をお願いします。

  • 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になるようにしたい }

  • 文字列のコピー

    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);で処理が止まってしまいます。入力した文字列を表示できるように、御指摘お願いします。

  • 文字列の扱いについて教えてください

    #include<cstdio> #include<cstring> #define _CRT_SECURE_NO_DEPRECATE 1 #define MAXBUFF 256 void s_swap(char* str_a, char* str_b) { char str_dummy[MAXBUFF]; strcpy_s(str_dummy,strlen(str_dummy),str_a); ★ strcpy_s(str_a,strlen(str_a),str_b); ★ strcpy_s(str_b,strlen(str_b),str_dummy); } void main(void) { char* str_a = "ABC"; char* str_b = "DEF"; int a; printf("呼出前:str_a=%s, str_b=%s\n", str_a, str_b); s_swap(str_a,str_b); printf("呼出後:str_a=%s, str_b=%s\n", str_a, str_b); } str_aとstr_bの中身を入れ替える処理で、エラーや警告はでないのですが ★のところで実行失敗します。 昔から文字列の処理は苦手でどのように攻略したらよいのか 解説していただけないでしょうか。

  • 文字列のswap

    文字列をswapするプログラムを作りたいと思っています。 やってみると、最初の一文字しかswapされません。 どうしてこれではいけないのでしょうか? よろしくお願いします。 以下が作ったプログラムです。 #include<stdio.h> void swap(char *a,char *b); int main() { char a[2][5]={"abc","efg"}; printf("befor a[0]:%s a[1]:%s?n",a[0],a[1]); swap(&a[0],&a[1]); printf("after a[0]:%s a[1]:%s?n",a[0],a[1]); } void swap(char *a,char *b) { char *tmp; tmp=*a; *a=*b; *b=tmp; } 実行結果は befor a[0]:abc a[1]:efg after a[0]:ebc a[1]:afg となります。 befor a[0]:abc a[1]:efg after a[0]:efg a[1]:abc となって欲しいです。

  • 文字列ポインタとgets関数の関係について。

    以下のプログラムはコンパイルは出来ますが、 実行するとクラッシュしてしまいます。 gets関数は char *gets( char *str ); と定義されているので文字列の先頭アドレスを返すはずですが 何故このプログラムはエラーが出るのでしょうか・・。 #include <stdio.h> int main ( void ){  char *p, *s;  p = gets(s);  printf("%s", p);  return 0; }

  • 文字列を入力・表示

    文字列を入力して表示したいのですができません。誤っていないと思うのですが・・・。何が間違っているのでしょうか? #include<stdio.h> void main (void) { char namae; printf("お名前を登録します。お名前を入力して下さい。\n"); scanf("%s",&namae); printf("お名前は%sですね。\n",namae); }

  • 文字列の探索

    ファイル名を指定して文字列の探索を行うというプログラムをC言語で作成したのですが、 コンパイルのときに警告で「問題のあるポインタの変換(関数 main )」と出て、うまい具合に動きません。改良点を教えてください。 #include<stdio.h> #include<string.h> #include<stdlib.h> unsigned char *s1; unsigned char *s2; unsigned char *cp; FILE *fp; char fname[64]; void TestStrStr(void); main(){ s1 = calloc(256, sizeof(unsigned char)); s2 = calloc(256, sizeof(unsigned char)); printf("Input Filename..."); scanf("%s",fname); while(1){ fp = fopen(fname, "r"); if(fp == NULL){ printf("ファイルを開くことができません...\n"); printf("Input Filename..."); scanf("%s",fname); }else break; } s1=fp; // printf("文字列1を入力してください:"); // scanf("%s",s1); printf("文字列2を入力してください:"); scanf("%s",s2); TestStrStr(); return 0; } void TestStrStr(void){ cp = strstr(s1, s2); if(cp == NULL) printf("'%s'に'%s'のいずれの文字も含まれない.\n", s1, s2); else printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1); free(s1); free(s2); }

  • 数値→文字列変換関数

    ・数値を文字列化する関数StoAを作成する。 書式:char *StoA(short nVal); 引数:short nVal; 文字列化する数値 戻り値:数字文字列のポインタ 処理:nValで与えられたshort型の数値を文字列に変換し、そのポインタを返す。 呼び出し側の書式は以下の通り。 void main(void) { char *pc; pc = StoA(123); printf("%s\n", pc); pc = StoA(-1234); printf("%s\n", pc); } です。自分で途中までしたので見てください。 #include <stdio.h> cahr *StoA(short nVal); void main(void) { char *pc; pc = StoA(123); printf("%s\n", pc); pc = StoA(-1234); printf("%s\n", pc); } char *StoA(short nVal) { ここからがわかりません。どなたか助けて下さい。

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

    ◎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);」としてしまうと、何が起きてしまうのかわかりません。 以上、教えていただけると嬉しいです。

専門家に質問してみよう