• 締切済み

gets

struct phone_type { char name[100]; int areacode; char number[100]; } phone[MAX]; char temp; . . . gets(temp); phone[i].areacode = atoi(temp); tempに0000と入力するとareacodeには0しか入りません。 なぜでしょうか?

みんなの回答

  • na_kirajp
  • ベストアンサー率43% (33/76)
回答No.4

ほかの方の書かれていますが、数値として扱う為にatoiしてint型にしていますよね。 なので(数値なので)0です。0000でも電卓では0ですよね! 0000にしたい理由が別に有るのでしょうか? そうであればint型など不要で文字列(CHAR)として扱うしかありませんが

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>0000を入れたい char areacode[6]; とでもしましょう。 表示する時に0を付けたいだけなら intのままでも printf("%04d",areacode); とでもすればいいです。

全文を見る
すると、全ての回答が全文表示されます。
  • na_kirajp
  • ベストアンサー率43% (33/76)
回答No.2

tempは文字列ですが、areacodeはintなので数字です。 ましてareacodeに入れるときにatoiしているので文字列→int変換した結果が入るからです。 areacodeに0000を入れたいって事ですか?

morumomo
質問者

補足

0000を入れたいてことです。すいません。

全文を見る
すると、全ての回答が全文表示されます。
  • nagare
  • ベストアンサー率33% (280/831)
回答No.1

areacodeの型はintですよね だから0が入るのです atoiで[文字→数値変換]してるじゃないですか intをわかってます??? というくらいの質問なんですけど

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • gets関数と構造体について

    名前を入力して、各教科の点数を入力したあと、それを表示するプログラムを作りました。 完成はしたのですが、分からないところがあるので質問させて頂きます。 #include <stdio.h> #include <string.h> typedef struct { char name[32]; int kokugo; int rika; } siken; int main() { siken tensu[5]; // = {"三村",80,45,"大竹",90,85,"松本",75,60,"狩野",100,100,"大江",95,90}; char name[32],point[16],end[6]; int i=0; do { printf("名前を入力してください。 : "); gets(tensu[i].name); //tensu[i].name = name; printf("国語 : "); gets(point); tensu[i].kokugo = atoi(point); printf("理科 : "); gets(point); tensu[i].rika = atoi(point); i++; printf("入力を終わりますか?(YES=0,NO=1) : "); gets(end); } while (atoi(end)); i=0; do { printf("氏名を入力して下さい。 : "); gets(name); while (strcmp(name,tensu[i].name)) i++; printf("氏名 : %s\n国語 : %d\n理科 : %d\n",tensu[i].name,tensu[i].kokugo,tensu[i].rika); printf("終わりますか?(YES=0,NO=1) : "); gets(end); if (atoi(end)==0) break; else if(atoi(end)!=1) { printf("入力に誤りがあります。もう一度入力して下さい。 : "); gets(end); continue; } } while (atoi(end)); return 0; } このプログラムの printf("名前を入力してください。 : "); gets(tensu[i].name); //tensu[i].name = name; printf("国語 : "); gets(point); tensu[i].kokugo = atoi(point); printf("理科 : "); gets(point); tensu[i].rika = atoi(point); i++; printf("入力を終わりますか?(YES=0,NO=1) : "); gets(end); の部分で、点数を入力するとき、 scanf("%d",tensu[i].kokugo); とすると、入力を終了するための入力が飛ばされ、いきなり表示に行きます。(入力を終わりますか?の表示のだけですぐデータ表示のための「氏名を入力してください」が表示される感じです。) また、この部分の最後のendをint型のj(初期化したものです)に置き換えると「入力を終わりますか?」の入力はできるのですがデータの表示がエラーでできなくなります。 この部分が分からず、もやもやが残っているので質問させていただきました。 長文で申し訳ないです。 回答よろしくお願いいたします。

  • getsの部分がとばされてしまう

    #include<stdio.h> typedef struct Car{ char name[20]; int num; double gas; }Car; int main(void) { Car car[3]; int i; for(i=0;i<3;i++){ printf("ナンバーを入力してください。\n"); scanf("%d",&car[i].num); printf("車の名前を入力してください。\n"); gets(car[i].name); printf("ガソリン量を入力してください。\n"); scanf("%lf",&car[i].gas); } printf("name\tnumber\tfuel\n"); for(i=0;i<3;i++){ printf("%s\t%d\t%f\n",car[i].name,car[i].num,car[i].gas); } return 0; } …上記のようなプログラムを書いたのですが、実行すると、gets(car[i].name);の部分の処理が飛ばされてしまい、入力することができません。 どのようにしたらよいか、教えていただけませんでしょうか。 よろしくお願いいたします。

  • "gets"は危険なのでしょうか?

    以下をコンパイルした際に"gets function is dangerous and should not be used "と警告が出ました。直訳すると"getsは危険だから使わないほうが良い"となるのですが、今私の使用している教本には"'gets'に代わる文字列入力の便利な方法は無く、入力文字数が配列を超えないように"との注意しかなく、それは厳守しています。プログラムがいけないのでしょうか。 #include <stdio.h> int main(void) { char str[80]; int i; printf("文字列を入力してください(80文字以下): "); gets(str); for(i=0; str[i]; i++) printf("%c", str[i]); return 0;

  • 至急!教えてください。

    #include <stdio.h> #include <windows.h> #define COUNT (3) struct Seiseki{ char name[20]; int score1; int score2; int score3; int score4; int score5; int average; }; int getValue(char str[], char temp[], int n){ memset(temp, 0, 19); while(*(str+n) == ' '){ n++; } int i = 0; while(*(str+n) != ' ' && *(str+n) != 0){ temp[i] = *(str+n); i++; n++; } return n; } void getAverage(Seiseki *seiseki){ int total = seiseki->score1 + seiseki->score2 + seiseki->score3 + seiseki->score4 + seiseki->score5; seiseki->average = total / 5; } void getSeiseki(Seiseki seiseki[]){ char temp[20]; char str[256]; for(int i = 0; i < COUNT; i++){ printf_s("%d 人目の点数と名前 > ", i+1); memset(str, 0, 255); gets(str); int n = 0; n = getValue(str, temp, n); strcpy(seiseki[i].name, temp); n = getValue(str, temp, n); seiseki[i].score1 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score2 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score3 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score4 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score5 = atoi(temp); getAverage(&seiseki[i]); } } void showSeiseki(Seiseki seiseki[]){ for(int i = 0; i < COUNT; i++){ printf("%d %s %d %d %d %d %d\n", i+1, seiseki[i].name, seiseki[i].score1, seiseki[i].score2, seiseki[i].score3, seiseki[i].score4, seiseki[i].score5, seiseki[i].average); } } void showScoresAverage(Seiseki seiseki[]){ int total1 = 0; int total2 = 0; int total3 = 0; int total4 = 0; int total5 = 0; for(int i = 0; i < COUNT; i++){ total1+=seiseki[i].score1; total2+=seiseki[i].score2; total3+=seiseki[i].score3; total4+=seiseki[i].score4; total5+=seiseki[i].score5; } int ave1 = total1 / COUNT; int ave2 = total2 / COUNT; int ave3 = total3 / COUNT; int ave4 = total4 / COUNT; int ave5 = total5 / COUNT; printf_s("\naverage %d %d %d %d %d\n",ave1, ave2, ave3, ave4, ave5); } void main(){ Seiseki seiseki[COUNT]; printf_s("生徒 %d 名分の成績を入力してください:\n", COUNT); getSeiseki(seiseki); printf_s("\n成績表\n# NAME #1 #2 #3 #4 #5 average\n"); showSeiseki(seiseki); showScoresAverage(seiseki); } 間違っている点がありますか? ありましたらどこに入れるか教えてください。 改良点などありましたらお願いします。

  • 至急お願いします!!

    CSVファイルを読み込んで構造体に格納し、格納したデータを標準出力、女性のデータだけを標準出力、その後データのナンバーを昇順にソートし標準出力しようとしていますが、下2つが上手く出力できません・・・ どなたか、間違いを指摘してもらえませんか? CSVファイルの内容 ***************************************************************** 022023,金沢聖悟,M,012-345-6789 022011,鈴木信也,M,123-456-7890 022025,佐々木小太郎,M,901-234-5678 032002,加田宮千代子,F,890-123-4567 032011,ラスコーニ・イワンチャコフ,M,789-012-3456 032020,渡辺真,M,678-901-2345 032050,加藤江美,F,567-890-1234 042007,萩原雄一,M,456-789-0123 042010,井上麻衣,F,345-678-9012 042014,カイ・ハンセン,M,234-567-8901 042035,近松門左衛門,M,111-222-3333 042044,セルビア・モンテネグロ,F,555-555-5555 ************************************************************** プログラム *************************************************************** #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NUMBER_LENGTH 30 #define MAX_NAME_LENGTH 20 #define MAX_SEX_LENGTH 2 #define MAX_TEL_LENGTH 20 #define MBF 256 struct NameCard{ char number[MAX_NUMBER_LENGTH]; // 番号 char name[MAX_NAME_LENGTH]; // 名前 char sex[MAX_SEX_LENGTH]; // 性別 char tel[MAX_TEL_LENGTH]; // 電話番号 }; void swap(struct NameCard * ,struct NameCard *); void sort(struct NameCard [], int ); int main(void) { FILE* fp; /* ファイルポインタ用 */ char *ret; /* ファイル名用 */ char *c,ch[MBF]; /* 文字入力用 */ int i = 0; int n,k; struct NameCard ncd[20]; if((fp = fopen("meibo.csv", "r")) == NULL) printf("ファイルをオープンできません\n"); //exit(1);/* 強制終了 */ else{ printf("読み込んだファイルを表示します\n"); while ( fgets(ch,MBF,fp) != NULL){ //printf("test\n"); strcpy(ncd[i].number,strtok(ch,",")); strcpy(ncd[i].name,strtok(NULL,",")); strcpy(ncd[i].sex,strtok(NULL,",")); strcpy(ncd[i].tel,strtok(NULL,",")); atoi(ncd[i].number); printf("%s,%s,%s,%s",ncd[i].number,ncd[i].name,ncd[i].sex,ncd[i].tel); i++; } //printf("%s\n",ncd[0].sex); //printf("%s\n",ncd[1].sex); //printf("%s\n",ncd[2].sex); //printf("%s\n",ncd[3].sex); printf("女性のリスト\n"); for(n=0;n<i;n++) { //printf("test\n"); if(ncd[n].sex==c){ //printf("test\n"); printf("%s,%s,%s,%s",ncd[n].number,ncd[n].name,ncd[n].sex,ncd[n].tel); }else; } } sort(ncd, i); printf("ソート後\n"); for(k=0;k < i;k++) { printf("%s,%s,%s,%s",ncd[k].number,ncd[k].name,ncd[k].sex,ncd[k].tel); } fclose(fp); /* ファイルクローズ */ return(0); } void swap(struct NameCard *x,struct NameCard *y) { struct NameCard temp = *x; *x = *y; *y = temp; } void sort(struct NameCard 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].number > data[i].number){ j = i - 1; swap(&data[i],&data[j]); } k = j; } }

  • Segmentation fault

    Cygwinにてアルゴリズムの勉強のためにC言語で コーディングしているのですが、Segmentation fault (core dumped) という言葉が出てファイルを実行できません。 試行錯誤しているのですが手に負えません。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define MAX_LINE 30 int main(void); int main(void){ char buffer[3]; int taro,hanako,number; int judge[4][4] = {{3,1,2,2,},            {2,3,1,2,},             {1,2,3,2,},             {1,1,1,3,},                 }; char kekka[3][MAX_LINE] = {"太郎の勝ち", "花子の勝ち", "あいこ" }; gets(buffer); taro = atoi(buffer); taro = taro-1; gets(buffer); hanako = atoi(buffer); hanako = hanako-1; number = judge[taro][hanako]; printf("じゃんけんの結果は%sです。",kekka[number][MAX_LINE]); return(0); }

  • gets()で得たものの配列化

    こんにちは。Cプログラミング初心者です。 gets()で得た空白付文字列を、 コマンドライン入力のargv[]のように配列化したいです。 例: 入力:This is a pen. tmess[0] This tmess[1] is tmess[2] a tmess[3] pen. 区切り文字列" "で、strtok()を使えばよいかと思いましたが、 空白が認識されずエラーが出てしまいます。 int flag,n=0,i; char *mess,**tmess; gets(mess); flag=strtok(mess," "); if(flag!=NULL){ while(flag!=NULL){ tmess[i]=flag; flag=strtok(NULL," "); n++; } どうすれば空白を認識してくれるのでしょうか? また、他に良い方法があるのでしょうか.. 回答よろしくお願いします。

  • プログラムについてです。

    クラスの身体計測簿をつくるプログラムを作成したいのですが、 以下のプログラムの修正点を指摘願います。 項目は、氏名 身長 体重です。 #include <stdio.h> #define MAX_氏名 50 /*maximum length of name */ #define MAX_身長 200 /*maximum length of height code */ #define MAX_体重 120 /*maximum length of weight */ struct person{ char 氏名[MAX_氏名+1]; char 身長[MAX_身長+1]; char 体重[MAX_体重+1]; }; main() { struct person Book; printf("氏名を入力してください.\n"); gets(Book.氏名); printf("身長を入力してください.\n"); gets(Book.身長); printf("体重を入力してください.\n"); gets(Book.体重); puts(Book.氏名); puts(Book.身長); puts(Book.体重); } こんなんでよろしいのでしょうか?? あと、身長順に並び変えたりするにはどのようなプログラムを用いたらよいのでしょうか??

  • C言語の添削

    「C言語基礎課題1」 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <tchar.h> #include <ctype.h>                                       #include <string.h> #define MAX 100 /*点数*/ int flag; double avg(double t[],int n); int str_check(char s[]);                                        int main() { int number; //人数 double score[MAX]; //点数 char temp[MAX]; char str[MAX]; //名前 double ans; //平均成績 int i=0; //カウンタ変数 //人数の決める printf("人数を入力して下さい。\n"); scanf("%d",&number); //名前の入力 for(i=0;i<number;i++) { printf("%d番様の名前を入力して下さい。\n",i+1); scanf("%s",&str[i]); } //点数の入力 for(i=0;i<number;i++) { printf("%d番様の点数を入力して下さい。\n",i+1); scanf("%s",&temp); str_check(temp); if(flag==1) { score[i]=atoi(temp); //点数入力で有効範囲をチェック if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } if(flag==0) { printf("点数を数字で入力して下さい。\n"); i--; } } ans =avg(score,number); printf("\n=====入力内容一覧と成績平均値======\n"); for(i=0;i<number;i++) { printf("%d番の点数は%3.2lfです。\n",i+1,score[i]); } printf("平均点は%3.2lfです。\n",ans); printf("=====================================\n"); getch(); return 0; } /*avg関数の定義*/ double avg(double t[],int n) { int i; double sum; sum = 0.0; for(i=0;i<n;i++) { sum += t[i]; } return sum/n; } /*点数入力で文字か数字かチェック*/ int str_check(char s[]) { int i=0,n; //カウンタ変数 n=strlen(s); while(s!='\0') { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { i++; } else { break; } } if(i==n) { flag=1; } else { flag=0; } return flag; } [最初に組んだソースプログラム] #include<stdio.h> #include<stdio.h> #define NUM 3 /*点数*/ #define Name 3 /*人数*/ #include<conio.h> double avg(int t[]); struct stList{ char str[Name][100]; int score[NUM]; int i,j; }; int main(void) { int score[NUM]; //char str[Name]; char str[100]; int i,j; double ans; printf("名前を入力して下さい。\n",Name); for(i=0;i<Name;i++){ scanf("%s",&str[Name]); } // if(score[NUM]=0 || score[NUM]<=100) //{ // printf("点数を入力して下さい。\n",NUM); //} printf("点数を入力して下さい。\n",NUM); for(i=0;i<NUM;i++) { scanf("%d",&score[i]); if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } for(j=0;j<NUM;j++){ printf("%d番目の人の点数は%dです。\n",j+1,score[j]); } ans =avg(score); printf("平均点は%3.2lfです。\n",ans); getch(); return 0; } /* avg関数の定義 */ double avg(int t[]) { int i; double sum; sum = 0.0; for(i=0;i<3;i++){ sum += t[i]; } return sum/Name; } 「一人分のデータを保持する構造体(文字列と整数の変数をメンバに持つ)を用意し、3人分の名前と成績 (最大値100、最小値0)を入力でき、入力が終了したら、入力内容一覧と成績の平均値を表示する プログラムを作成せよ。 ※考えうる限りの異常系処理の導入、関数化を行うこと。」 研修で以下の指摘を受けました。 (1)compare関数が使われていない。 (2)名前入れる変数が3つ不明 (3)カウンタ変数がi,j,s,tになっている理由は? (4)名前を入力しなかった時の処理 (5)点数を処理しなかった時の処理 (6)定数NUMで人数3を指定できるようにしているのにプログラムはそれを利用仕切れていない(名前入力が固定3人)ので無意味 (7)if(tmp=0 || tmp<=100)←これなんでしょうか? (8)平均点表示の少数点以下有効桁数はどうなっているのか? (9)点数入力で文字を入れたときの処理 (10)点数入力で有効範囲外の数字を入れた時の処理 ちなみに最大値、最小値はdefineして欲しいです。理由は(2)に読めば分かる (11)変数名が謎なのが多い 課題のキーワードのどこにも出て来ないですし言葉だから 後、添付ファイルを添付します。 最初のソースプログラム名「最初に組んだもの」修正したものが「C言語基礎課題1」と名付けています。 いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?

  • 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; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。