質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

1回答

543閲覧

二次元配列のポインタ渡しがうまくいかない

L4zy

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/05/01 11:43

hashInsert()関数に二次元配列のポインタを渡して、数値をhashArray[][]に代入したいのですが、物凄く大きな値がprintf("%d %d\n", hashArray[0][1], hashArray[0][2]);に出力されてしまいます。どこがおかしいのでしょうか?

C

1#include <stdio.h> 2#include <string.h> // strtok, strlen, memset 3#include <stdlib.h> // malloc 4#include <ctype.h> // isdigit 5#include <stdlib.h> // atoi 6 7int spacePart(char str[], char **num, int cnt); 8int numCheck(char *num[], int numCnt); 9void hashInsert(char *num[], int *hashArray[][7], int numCnt); 10// ハッシュ探索を行う関数 引数:なし 戻り値:0 メモリ確保できない-1 11int main() 12{ 13 int flg = 0, numCnt, find, *hashArray[100][7] = {}; 14 char str[1000], *num[100]; 15 // メモリ確保 16 *num = (char *)malloc(sizeof(str)); 17 18 // メモリ確保失敗 19 if(num ==NULL) 20 { 21 printf("メモリの確保に失敗しました。"); 22 return -1; 23 } 24 while(flg == 0) 25 { 26 puts("100個以内の数値を入力してください。"); 27 fgets(str, 1000, stdin); 28 29 // 文字列を空白ごと分け、入力値の数を代入する 30 numCnt = spacePart(str, num, 100); 31 32 // 入力値が数値だったら 33 if(numCheck(num, numCnt) == 1) flg = 1; 34 else puts("入力値が正しくありません。"); 35 } 36 // ハッシュ値に数値を代入する 37 hashInsert(num, hashArray, numCnt); 38 39 40//ここでなーい 41printf("%d %d\n", hashArray[0][1], hashArray[0][2]); 42 43 44 printf("探索対象の数値を入力してください:"); 45 scanf("%d", find); 46 free(*num); // メモリ解放 47 return 0; 48} 49 50// 文字列を空白ごとに分けて配列に格納し、入力値の数を返す関数 51// 引数:入力値、配列、100 戻り値:数値の数 52int spacePart(char str[], char **num, int cnt) 53{ 54 // 空白区切りに文字列を分割 55 num[0] = strtok(str, " \n"); 56 int i; 57 58 // 最大100個 59 for(i = 1; i < cnt; i++) 60 { 61 num[i] = strtok(NULL, " \n"); 62 // 区切った文字列がNULLだったら 63 if(num[i] == NULL) break; 64 } 65 num[i] = NULL; // 終わりのしるし 66 return i; 67} 68 69// 入力文字列が数値がチェックする関数 引数:入力値 戻り値:数値1 数値ではない0 70int numCheck(char *num[], int numCnt) 71{ 72 char *temp; 73 // 配列に値がある間 74 for(int i = 0; i < numCnt; i++) 75 { 76 temp = num[i]; 77 for(int j = 0; j < strlen(temp); j++) 78 { 79 // 数値ではなかったら 80 if( !isdigit(temp[j]) ) return 0; 81 } 82 } 83 return 1; 84} 85 86// 入力した数値を7で割った余りの配列に代入する関数  87// 引数:入力値、ハッシュ配列、数値の数 戻り値:なし 88void hashInsert(char *num[], int *hashArray[][7], int numCnt) 89{ 90 int j = 0; 91 for(int i = 0; i < numCnt; i++) 92 { 93 // メモリ確保 94 hashArray[j][atoi(num[i]) % 7] = (int *)malloc(100); 95 if(*hashArray[j][atoi(num[i]) % 7] == 0) *hashArray[j][atoi(num[i]) % 7] = atoi(num[i]); 96 else j++; 97 } 98 free(hashArray); // メモリ解放 99}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/05/01 12:00

その言ってるところはどこの話なんでしょうか
guest

回答1

0

printf("%d %d\n", hashArray[0][1], hashArray[0][2]);

ここの事でしょうか?
宣言を見ると、int flg = 0, numCnt, find, *hashArray[100][7] なので、hashArray[0][1] は、int * となりますが、期待するものでしょうか?
hashArray[0][2]も同様。

投稿2020/05/01 12:08

pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問