• 締切済み

c言語のポインタ

学校で、名前、住所などを構造体に入力するというプログラムをc言語で書いています。 そこで、質問なんですが・・・ fgetsで文字を入力し、構造体にデータを入れる関数に渡すと セグメンテーションエラーになってしまいます。 文字列のポインタの問題だと思うのですが、よくわかりません。 誰か教えてください!! ーーーーソースーーーーー printf("name "); fgets(xx,255,stdin); printf("%s",xx); printf("tel "); scanf("%s",t); strcat(t,"\n"); printf("zip "); scanf("%s",z); strcat(z,"\n"); printf("add "); scanf("%s",ad); strcat(ad,"\n"); printf("email "); scanf("%s",em); strcat(em,"\n"); root = makenode( *xx,ss,y,t,z,ad,em, root ); //関数で構造体にデータを挿入する 関数 BinNode *makenode( char *x,char *t,char *z,char*ad,char *em, BinNode *current ) { if( current == NULL ) //currentに何も入っていないとき { current = (BinNode*)malloc(sizeof(BinNode)); //領域を確保する strcpy( current->data, x ); //読みを入力 strcpy( current->tel, t ); //電話番号を入力 strcpy( current->zip, z ); //郵便番号を入力 strcpy( current->add, ad ); //住所を入力 strcpy( current->email, em ); //emailを入力 current->left = current->right = NULL; //右と左のノードをNULLにする }

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.3

> スペースを入力しても読み込むようにしたいのですが・・・ No.2さんが書かれているとおり、 問題を解決するためのとっかかりは、 お書きになったソースコードを「包み隠さず、そのまま」 コピー&ペーストすることです。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

> char *xx; > char y[255],t[255],z[10],ad[255],em[255]; 何でxxだけポインタなの? ポインタだと、mallocで領域確保せずにポインタが指す先の領域は使えないよ。 #どうでもいいことだけど255ってなんか気持ち悪いね。256にしない?(笑) > スペースを入力しても読み込むようにしたいのですが・・・ scanfの%s書式指定子は空白文字以外を読み込みます。 fgetsでも使って行単位で読み込んでください。 (fgetsは末尾に'\n'が残るので必要ないなら削除すること。) scanfでも%[^\n]とでもすれば改行文字まで読み込まれるとは思うけど、 そこまでしてscanfを使わなくても良いと思う。 気の利いたscanf -- part 1 http://homepage1.nifty.com/hujitako/yapt/SmartScanf1.htm 結局、コンパイル可能なソースの提示は無しなのか。 まあ、こっちで動作確認できなかったり、提示外の部分が問題だったりして、 正確な回答ができなくなるだけだから、 それでも良いって言うなら別にかまわんけど。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

ソースは一部抜粋じゃなくて、 その現象が発生するコンパイル可能な最小限のソースを作って欲しいな。 xxとかの宣言部がないから型が何なのか推測でしか分からないし、 BinNodeの構造もさっぱり分からん。 でぱっと見おかしそうな所は > root = makenode( *xx,ss,y,t,z,ad,em, root ); ここでxxに*がついてるところかな。

ckawrfgd03
質問者

補足

構造体は木構造です。 struct BinNode_type{ char data[255],tel[255],zip[255],add[255],email[255]; struct BinNode_type *left, *right; }; //構造体(木構造)のメンバの定義 変数の宣言は char *xx; char y[255],t[255],z[10],ad[255],em[255]; です。 スペースを入力しても読み込むようにしたいのですが・・・

関連するQ&A

  • C言語を使ったプログラム作成

    ご教授お願い致します。 strcpy(),strcat(),strcmp() 上記3つの標準関数と同じ機能を持った関数をポインタを使用してプログラム作成 関数名 (1)*u_strcpy (2)*u_strcat (3)*u_strcmp strcpy()は char *u_strcpy(char *s,char *t) { char *p=s; while(*s++=*t++) return p; } void main(void) { char x[10],y[10]; scanf("%s %s",x,y); printf("%s\n",u_strcpy(y,x)); } で正常に動いたので大丈夫だと思いますが他2つがわかりません。

  • C言語 ポインタと配列

    #include <stdio.h> /* scanf("%c", &search); ではなく scanf(" %c", &search); であることに注意する */ char *str_chr(const char *str, char c) { char *find; find = NULL; do { if(*str == c) { find = (char*)str; break; } } while(*str++); return(find); } int main(void) { char str[100] = {0}; char search; char *find; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &search); find = str_chr(str, search); if(find == NULL) { puts("検索した文字は見つかりませんでした。"); } else { printf("検索した文字 %c は\"%p\"にあります。\n", *find , find); } return(0); } このコードのfind = (char*)str;の (char*)str;の部分がどうなっているのかわかりません。 あとこのfindというのは&find[0]という解釈でいいでしょうか? 教えてくださいm(_ _ )m

  • C言語のポインタのことで

    int num=15; int *p=&num; char h= 'A'; char *p=&h; って、数字や一文字の時は変数を用意しなくてはならないのに、 char *z="K"; ←ダブルクォーテーションで囲むと1文字もOK printf("%c\n",*z); とか、 char *name="名前"; printf("%s\n",*name); とかの場合、変数を用意しなくてもできますよね。 文字はどこか別の場所に保管されているのでしょうか?

  • c言語

    c言語の問題なんですが 氏名を姓と名に半角空けて1列に入力し、姓と名の文字数を数えるプログラムを書いてみましたがうまく走りません原因がわからないので誰か教えてください。ちなみに、書いたプログラムは、 #include <stdio.h> void mojisu(char z[] ); int main() { char z[30]; printf("氏名を英語で入力\n"); scanf("%s\n",&z); mojisu(z); } void mojisu(char z[] ) { int sei,mei, b; for(b =0,sei=0; z[b]==' '; b++); { sei+=1; } printf("姓の文字数は%d\n",sei); for(b =sei+1,mei=0 ; z[b]=='\0'; b++); { mei+=1; } printf("名の文字数は%d\n", mei); }

  • C言語について

    いつもお世話になっています。 以下のソースを分割コンパルをしたいのですが・・・コンパイルがとおりません。 環境としては、Visual Studio 2005 です。 ヘッダファイルは、 /* People.h */ #include <stdio.h> #include <string.h> typedef struct { char name[256]; int age; int sex; } People; /* 個人データを入力する */ extern void InputPeople(People *data); /* 個人データを表示する */ extern void ShowPeople(People data); で、 /* People.c */ #include "People.h" void InputPeople(People *data) { /* 中身は同じなので省略 */ printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n"); } void ShowPeople(People data) { /* 中身は同じなので省略 */ char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n"); } どこがおかしいのでしょうか?? あと、コマンドのところでは、 C:\ > ←のあとは、普通にcl People.cとすればいいのでしょうか?

  • C言語 プログラミング

    C言語、プログラミングの質問です。 構造体について、 プログラムを組んでみたのですが、上手く出力されません。実行時にはエラーはないのですが、出力時に上手くいきません。どなたかどこがおかしいかわかる方、教えていただけませんでしょうか? #include <stdio.h> struct user{ char *name; char *id; int books; }; int main (void) { struct user u; printf("氏名を入力して下さい。"); scanf("%s",u.name); printf("パスワードを入力してください。"); scanf("%s",u.id); printf("年齢を入力してください。"); scanf("%d",&u.age); printf("氏名 %s\n",u.name); printf("パスワード %s\n",u.id); printf("年齢 %d\n",u.age); return 0; } よろしくお願いします。

  • C言語

    文を繰り返すときに、『続けますか(Y=続行。N=終了)』と表示して、Yが入力されたら文を繰り返すようにしたいのですが、わからないので教えてください。 #include<stdio.h> int main(void) { int m,s,r,num; char moji; num=1; do{ printf("距離を入力してください。\n"); scanf("%d",&m); printf("平均速度を入力してください。\n"); scanf("%d",&s); r=m/s; printf("所要時間は%dです。\n",r); printf("続けますか?(Y=続行。N=終了)\n");/*このあたりがどうすればいいのかわかりません*/ moji=getchar(); }while(num) printf("終了します。\n"); return 0; }

  • C言語での構造体

    C言語の構造体で配列を扱うとき、 struct ○○{  char ○○[○] とすれば出来ますが、同じようにして構造体で二次元配列を扱うことは出来ますか? 一度組んでみたのですが、 #include<stdio.h> struct aaa{ int no; char name[128]; char y_name[128]; char n_name[128]; char s_name[128][128]; }; int main(void){ int i; struct aaa iryo[99]; printf("入力前\n"); /* 構造体配列に scanf()でデータを入力 */ for(i = 0; i < 3; i++) { // printf("input...\n"); scanf("%d", &iryo[i].no); scanf("%s", iryo[i].name); scanf("%s", iryo[i].y_name); scanf("%s", iryo[i].n_name); scanf("%s", iryo[i].s_name); } printf("入力後\n"); printf("出力前\n"); /* 入力データの確認 */ for(i = 0; i < 3; i++) { printf("番号:%02d 内容:%s Y分岐:%s N分岐:%s 他分岐:%s\n", iryo[i].no, iryo[i].name, iryo[i].y_name, iryo[i].n_name, iryo[i].s_name); } printf("出力後\n"); printf("%d",sizeof(struct aaa)); return 0; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • C言語のchar ポインタ

    char ポインタで分からないことがあるのですが・・↓ ------ { char array[7]; char *ptr; strcpy(array, "abcdef"); ptr = &(array[0]); printf(" array = %s\n ptr = %s\n", array, ptr); } ------ これを実行して, array = abcdef になるのは分かるのですが ptr = abcdef  になるのはどうしてでしょうか。 ポインタはアドレスを指し示すものですよね。だったら ptr = にはarray[0]のアドレス('a'のアドレス)が入るのでは 無いんでしょうか・・?

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

専門家に質問してみよう