• ベストアンサー

C言語 初心者です。

いつもお世話になっています。 またまた困ってます。 以下のソースは一部分を抜粋したものです。 質問内容ですが、現在コンパイルをすると、warningが出てきて、型の互換性がありません。とでてきます。たぶん文字列の長さを読むときがおかしいみたいで、型を色々変えましたが、warningはとれません。どうしたらいいか教えてください。 ちなみに #define NAME 128 /* IDの桁数 */ typedef struct { char name[NAME]; /* 社員番号 */ } syain; size_t str_length(char *str) { size_t length = 0; while (*str++){ length++; } return(length); } void namecheck(syain data[], int syain_num) { int len = 0;/* 社員名の桁数 */ while(1){ printf("社員名:"); scanf("%s", data[syain_num].name); /* 社員名の桁数を変数lenに格納する */ len =(unsigned)str_length(data[syain_num].name); putchar('\n'); if (len < NAME){ break; } } } void syaintouroku(syain data[], int syain_num) { namecheck(data[syain_num].name, syain_num); putchar('\n'); } int main(void) { syain meibo[MAX_NUMBER]; int max_syain = 0; int i; syaintouroku(meibo, max_syain); max_syain++; return (0); }

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

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

No2さんのでよければ、以下だけを変えればいいと思います void namecheck(char* name) { int len = 0;/* 社員名の桁数 */ while(1){ printf("社員名:"); scanf("%s", name); /* 社員名の桁数を変数lenに格納する */ len =(unsigned)str_length(name); putchar('\n'); if (len < NAME){ break; } } } void syaintouroku(syain data[], int syain_num) { namecheck(data[syain_num].name); putchar('\n'); }

hatenan114
質問者

お礼

わかりやすく、ソースを付けていただき、ありがとうございます。 またよろしくお願いします。

その他の回答 (4)

  • tanida
  • ベストアンサー率0% (0/2)
回答No.5

ちょっと回答ではないのですが。。 size_t str_length(char *str){} という関数をつくらなくても、 include <string.h> size_t strlen(const char *s); という関数がありますよ。。 知っていたらごめんなさい。

参考URL:
http://www1.cts.ne.jp/~clab/Contents/StdLibFunc.html
hatenan114
質問者

補足

回答有難うございます。 結果は一緒でwarningdで char[]とsyain *の間で互換性がないとでました。

noname#50176
noname#50176
回答No.3

size_t str_length(char *str) { size_t length = 0; int i = 0; while (str[i++]){ length++; } return(length); } はでどうですか?

hatenan114
質問者

補足

回答有難うございます。 結果は一緒でwarningdで char[]とsyain *の間で互換性がないとでました。

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

syaintouroku関数でnamecheck関数を呼び出しているところを namecheck(data, syain_num); としてみてください。

hatenan114
質問者

お礼

回答ありがとうございます。 訂正してみます。

noname#50176
noname#50176
回答No.1

len =(unsigned)str_length(data[syain_num].name); は len =(int)str_length(data[syain_num].name); ですね。

hatenan114
質問者

補足

回答有難うございます。 結果は一緒でwarningdで char[]とsyain *の間で互換性がないとでました。

関連するQ&A

  • C言語について

    いつも、お世話になっています。 以下のソースでわからないことがあります。 1.構造体入れ子になっている SCH の代入方法。 2.一覧表示するとき、入れ子になっているSCHの表示方法。 3./*IDの入力後に社員リストからそのIDを呼び出す*/の件ついての考え方。 宜しくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #define MAX_NUMBER 100 /* 登録件数 */ #define NAME 30 /* 氏名の文字数 */ #define LINE 100 /* スケジュールの文字数 */ #define NUM 4 /* IDの桁数 */ typedef struct { char SCH[LINE]; /* 予定 */ } work; typedef struct { char ID[NUM]; /* 番号 */ char name[NAME]; /* 氏名 */ work sched; } syain; void namecheck(char* ID) { printf("ID:"); scanf("%s", ID); } void namecheck(char* name) { printf("名前:"); scanf("%s", name); } void syaintouroku(syain data[], int syain_num) { IDcheck(data[syain_num].ID); namecheck(data[syain_num].name); } void sched_touroku(syain data[], int syain_num) { puts("登録するIDを入力してください。"); /*IDの入力後に社員リストからそのIDを呼び出す*/      /*そのIDの方のスケジュールを登録*/ SCHcheck(data[syain_num].work.SCH); } void print_data(syain data[], int syain_num) { for(i = 0; i < MAX_NUMBER; i++){      printf(data[syain_num].ID, data[syain_num].name, data[syain_num].work.ID,); } } int main(void) { syain meibo[MAX_NUMBER]; int max_syain = 0; syaintouroku(meibo, max_syain); max_syain++; worktouroku(meibo, syain_num); print_data(meibo, syain_num) return 0; }

  • C言語

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。考えたのですが、分かりません。(コンパイルエラーです。)教えてください。宜しくお願いします。#include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

  • 関数について

    いつも、お世話になっています。 また、教えてもらえないでしょうか? printf("count%d\n", count);では、カウントしているのですが、 mainに戻ったときに、 printf("登録件数%d\n", max_syain); では 0 でかえってきます。 何故なんでしょうか? 教えてください。 int SYAINTOUROKU(syain data[], int syain_num) { int count = syain_num; int touroku_repeat; while (1){ if(count > MAX_NUMBER){ return 0; } syaintouroku(data, count); count++; sortID(data, count); write_syainfile(data, count); scanf("%d", &touroku_repeat); printf("count%d\n", count); if(touroku_repeat == 0) break; } return (count); } int main(void) { syain meibo[MAX_NUMBER] = {{0x00} ,{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00} ,{0x00}, {0x00}}; int max_syain = 0; SYAINTOUROKU(meibo, max_syain); printf("登録件数%d\n", max_syain); return 0; }

  • C言語 逆順の配列の仕方を教えてください

    今、大学でC言語の課題をやっています。サンプルが与えられています。 その課題は、配列の逆順です。 for文を使って、実行結果は以下のようにならなければならなく、「並び替えの結果は再び num1, num2 に保存される」という条件なのですが、逆順になるにはどのようなプログラムを組めば良いのでしょうか? ソースの「 /* ここに処理を書く */」にプログラムを書かなければいけないのですが、まったくの初心者でわかりません。誠にお手数ですが、教えていただければ幸いです。宜しくお願いいたします。 -----実行結果----- C:\c_lang>reverse --- before --- 2 4 9 10 5 3 1 7 8 6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --- after --- 6 8 7 1 3 5 10 9 4 2 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 -----以下ソース----- #include <stdio.h> void print_num( int *num, int len ); void reverse_num( int *num, int len ); int main( void ) { int num1[10]={2,4,9,10,5,3,1,7,8,6}; int num2[15]={1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15}; printf("--- before ---\n"); print_num( num1, 10 ); print_num( num2, 15 ); /* 逆順に並べ替え */ reverse_num( num1, 10 ); reverse_num( num2, 15 ); printf("--- after ---\n"); print_num( num1, 10 ); print_num( num2, 15 ); return 0; } void print_num( int *num, int len ) { int i; for( i=0; i<len; i++ ){ printf( "%d ", num[i] ); } printf("\n"); } void reverse_num( int *num, int len ) { /* ここに処理を書く */ } -----ソースここまで-----

  • C言語の初心者です。教えてください

    #include<stdio.h> #define NAME 4 void main() { char str[NAME]; int i; for (i = 0;i < NAME;i++){ scanf("%s", &str[i]); } for(i = 0; i < NAME;i++){ printf("%s\n", str[i]); } } どこか間違っているのですか?それとも何か足りないのでしょうか? お願いします。

  • c 言語初心者です。

    c 言語初心者です。 私は下記の構造体配列をつくりました。 しかしバッファオーバーランが起きてエラーが起きてしまいます。 ヒープ領域に問題があるのかもしれませんが、プログラム上どこに原因があるのかが良くわかりません。 どなたかよろしければ教えていただけないでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include<memory.h> struct s { int i; char name[25]; char huri[25]; char num[23]; }; void touroku(struct s *p); void hyouji(struct s *p); int main(void) { struct s data; touroku( &data ); hyouji( &data ); //data.num *= 1; /* dataはポインタではないのでドット演算子 */ hyouji( &data ); return 0; } /* 構造体のメンバを設定する */ void touroku(struct s *p) { int i=0; for(i=1;i<3;i++) { printf( "25文字以内の名前を入力して下さい\n" ); memset(p[i].name, 0, sizeof(p[i].name)); fgets( p[i].name,sizeof(p[i].name) , stdin ); if(strchr(p[i].name,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].name[strlen(p[i].name)-1]=='\n')//改行解除 { p[i].name[strlen(p[i].name)-1] = '\0'; } printf("25文字以内のふりがなを入力してください\n"); memset(p[i].huri, 0, sizeof(p[i].huri)); fgets(p[i].huri,sizeof(p[i].huri),stdin); if(strchr(p[i].huri,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].huri[strlen(p[i].huri)-1]=='\n')//改行解除 { p[i].huri[strlen(p[i].huri)-1] = '\0'; } printf( "整数を入力して下さい\n" ); memset(p[i].num, 0, sizeof(p[i].num)); fgets(p[i].num,sizeof(p[i].num),stdin ); if(strchr(p[i].num,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].num[strlen(p[i].num)-1]=='\n')//改行解除 { p[i].num[strlen(p[i].num)-1] = '\0'; } } } /* 構造体のメンバを出力する */ void hyouji(struct s *p) { int i=0; for(i=1;i<3;i++) printf("%-8s %3s %3s %d\n" ,p[i].name , p[i].huri , p[i].num , i); puts("----------------------------------------------------------------"); return ; }

  • C言語 初心者です。

    今、英単語帳を作っているのですが、以下のソースではできません。 作ろうとしているプログラムは、a bを登録した場合、次がaabと来たら、 a aab bといったようにしたいのですが、できません。教えてください。 #include <stdio.h> #include <string.h> #define NUMBER 50 /*--- 単語帳の構造体*/ typedef struct { char *word; } words; /*--- 文字列strから文字列wordを検索する ---*/ char *str_chr(const char *str, int w) { for ( ; *str; *str++){ if (*str == w){ return ((char *)str); } } return (NULL); /*検索したが該当しないときはNULLを返す*/ } /*--- 単純交換ソート ---*/ void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } /*--- 配列dataの先頭n個の要素を昇順にソート ---*/ void sort(words data[], int n) { int k = n - 1; while (k >= 0){ int i, j; for (i = 1, j = -1; i <= k; i++) if (data[i - 1].word > data[i].word){ j = i - 1; swap(&data[i], &data[j]); } k = j; } } int main(void) { words word[NUMBER][20] = {{0},{0}}; char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; char w[128], *p; int count = 0; do{ printf("単語を入力してください。:"); /*単語を入力する*/ scanf("%s", w); p = str_chr(str, w); }while(p == NULL); count++; if(count >= NUMBER){ /*登録件数を調べる*/ printf("件数いっぱいです。\n"); } return (0); sort(word, NUMBER); return (0); }

  • c言語 

    データを構造体の配列に格納したいのですが、このやり方ではできませんでした。どうすればいいですか? (ファイル内のデータを読み込んで格納しようとしています。) typedef struct dataset{ int price; char id; char name; }data; int main(void) { FILE *f = fopen("input.txt","r"); FILE *output = fopen("output.txt","w"); char order[100]; char name[100]; char id[100]; int price; int num = 0; while(fscanf(f,"%s",order) != EOF){ fscanf(f,"%s%s%d",product->name[num],product->id,&product[num].price); num++; } } return 0; } input.txt CD Kenji 300 DVD Nanako 350 PC Koki 1000 ........

  • C言語で分からないところがあるのですが

    すみません。C言語のポインタで分からないことがあって来ました。 ポインタの理屈は理解してはいるのですが、いざソースコードを書いてみようということになると全く手がつけられずにいます。 以下のソースコードですが、strlen()と同じ働きをする関数mystrlen()と、strcmp()と同じ働きをする関数mystrcmpを、ポインタを使って作成するものです。どこをどうすればいいのか教えてくださいませんか。 #include <stdio.h> int main(void) { char str1[80], str2[80]; int i, j; int len1, len2; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /* * 文字列の長さを確認する */ /* NULL文字(文字列の最後)まで読み飛ばす */ for (len1 = 0; len1 < 80 && str1[len1] != '\0'; len1++) ; /* ループ終了後、len1 に文字列の長さが入っている */ if (len1 < 80) { printf("%s は %d 文字の長さです\n", str1, len1); } else { printf ("第1の文字列が80字以上あります\n"); } /* str2 についても同様 */ for (len2 = 0; len2 < 80 && str2[len2] != '\0'; len2++) ; if (len2 < 80) { printf("%s は %d 文字の長さです\n", str2, len2); } else { printf ("第2の文字列が80字以上あります\n"); } if (len1 < 80 && len2 < 80) { for (i = 0; i < 80 && str1[i] != '\0' && str2[i] != '\0' && str1[i] == str2[i]; i++) ; if (str1[i] == str2[i]) { /* 両者同時に == '\0' のはず*/ printf("文字列は等しい\n"); } else if (str1[i] < str2[i]) { /* str1[i] == '\0' のはず*/ printf("%s は %s より小さい\n", str1, str2); } else { /* str2[i] == '\0' のはず*/ printf("%s は %s より大きい\n", str1, str2); } } /* * 十分なスペースがあれば、str2をstr1の最後に連結する */ if (len1 + len2 < 80) { /* str1 の末尾を探す */ for (i = 0; str1[i] != '\0'; i++) ; /* ループを抜けた段階では i は len1 と同じはずなので、 上記のループを作らず、i の代わりに len1 を用いるのも可 */ /* それ以降に str2 の中身をコピーする */ for (j = 0; str2[j] != '\0'; j++) { str1[i+j] = str2[j]; } str1[i+j] = '\0'; printf("%s\n", str1); } else { printf ("文字列をつなげた長さが80字以上あります\n"); } /* * str2をstr1にコピーする */ if (len1 + len2 < 80) { for (i = 0; str1[i] != '\0'; i++) { str1[i] = str2[i]; } str1[i] = '\0'; printf("%s %s\n", str1, str2); } return 0; }

  • C言語 初心者

    コンパイルエラーはでないのに、 登録した単語を表示できません。 表示のところだと思うのですが・・・ /********************/ /*--- 英単語辞書 ---*/ /********************/ #include <stdio.h> #include <stdio.h> #define NUMBER 50 /*登録数*/ #define MAX_NAME 20 /*単語の最大文字数*/ #define MAX_WAYAKU 30 /*和訳の最大文字数*/ /************************/ /*--- 単語帳の構造体 ---*/ /************************/ typedef struct { char name[MAX_NAME]; /*単語*/ char wayaku[MAX_WAYAKU]; /*和訳*/ }words; /************************************************/ /*------ 単語と和訳の登録 ------*/ /* 関数tourokuword()は引数words tango[]の、イン*/ /*クリメントしたtango_counの順番に格納する。  */ /************************************************/ void tourokuword(words tango[], int tango_count) { char word[MAX_NAME]; /*単語の名前*/ char wa[MAX_WAYAKU]; /*単語の和訳*/ printf("[単語]:"); scanf("%s", word); /*単語を単語帳に登録*/ strcpy(tango[tango_count].name, word); printf("[和訳]:"); scanf("%s", wa); /*和訳を単語帳に登録*/ strcpy(tango[tango_count].wayaku, wa); } /***********************************************/ /*----- 単語の交換 -----*/ /***********************************************/ void swaps(words *x, words *y) { words temp = *x; strcpy(temp, *x); strcpy(*x, y); strcpy(*y, temp); } /***********************************************/ /*----- 登録された単語を表示する -----*/ /* 関数printword()は引数words tango[]の、イン */ /*クリメントしたtango_counの順番に表示する。  */ /***********************************************/ void printword(words tango[], int tango_count) { int i = 0; int j; puts("登録されている単語を表示します。\n"); for( i = 0; i < tango_count; i++){ for(j = i + 1; j < tango_count; j++){ if(strcmp(tango[i].name, tango[j].name) > 0){ swaps(&tango[i], &tango[j]); } } } for (i = 0 ; i < tango_count; i++) { printf("[単語]:%s\n",tango[i].name); /*単語の表示*/ printf("[和訳]:%s\n",tango[i].wayaku); /*和訳の表示*/ } } /****************/ /*--- メイン ---*/ /****************/ int main(void) { words tangochou[NUMBER]; /*単語帳に50件登録*/ int menu_num; /*メニュー番号*/ int slct_num; /*選択番号*/ int tango_count = 0; /*登録数のカウント*/ while(1){ /****************************/ /*--- メニュー番号の入力 ---*/ /****************************/ do { printf("1・・・登録. 2・・・表示. 3・・・終了.\n"); printf("メニュー番号を入力してください。:"); scanf("%d", &menu_num); /*メニュ番号の入力*/ if (menu_num > 0){ break; } }while(menu_num != 0); /*メニュ番号が該当しない時は再入力*/ switch (menu_num){ case 1 :/*--- メニュー 1:単語と和訳の登録 ---*/ while(1) { if (tango_count < NUMBER){ printf("英単語と和訳を入力してください。:\n"); /*単語と和訳の登録*/ tourokuword(tangochou, tango_count); tango_count++; }else { puts("50件以上です。\n"); return 0; /*50件以上は終了する*/ } /*登録を続けるか?*/ printf("続けますか【Yes・・・1/No…0】:"); scanf("%d", &slct_num); if(slct_num != 1){ /*0なら終了。1なら継続。*/ break; } } break; case 2 :/*--- メニュー 2:登録された単語と和訳の表示 ---*/ printword(tangochou, tango_count); /*単語と和訳の表示*/ break; case 3 :/*--- メニュー 3:終了 ---*/ puts("終了します。\n"); return (0); default:/*--- メニュー 4:非メニュー番号の処理 ---*/ puts("メニュー番号が間違っています。"); break; } } return (0); }

専門家に質問してみよう