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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

プログラミング言語

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

Q&A

解決済

1回答

610閲覧

ifで文字列の判定後、文字列の長さが増えてしまうことの疑問

AbeshiGF

総合スコア2

C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

プログラミング言語

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

0グッド

1クリップ

投稿2021/05/29 08:10

前提・実現したいこと

データの追加、削除ができるアプリケーションを作成する目的でC言語のプログラミングしています。
まだ未完成ですが、途中の処理において疑問点が出たのでこの場で質問させていただきます。

発生している問題・エラーメッセージ

質問の部分としては、202行目から始まるdo-whileの部分で、 販売日付として入力された文字列が全て数値であるかどうかの判定をしている、 strJudgeの変数について疑問点があります。 ひとつめの printf("%d", strlen(inHanbaibi)); のある部分ですが、確認のためにprintを入れています。 for(i = 0; i < strlen(inHanbaibi); i++) でループ処理を行うと、strlen(inHanbaibi)が一つ増えてしまう問題点があります。 if(inHanbaibi[i] >= '0' && inHanbaibi[i] <= '9') の部分に問題があると感じていて、 i = 0 , strlen(inHanbaibi) = 8 i = 1 , strlen(inHanbaibi) = 9 i = 2 , strlen(inHanbaibi) = 9 ... となってしまうのですが、 i = 0 の時の、 ifの前後で for { i = 0 , strlen(inHanbaibi) = 8 if(inHanbaibi[i] >= '0' && inHanbaibi[i] <= '9') ... i = 0 , strlen(inHanbaibi) = 9 } と変わってしまいます。 他のdo-whileではstrlen(文字列)が増えていませんので その後のifでstrJudgeに1を足さなくてもよくなります。 おそらくnull終端文字あたりが問題なのかと考えています。 ・なぜこの動作が起きているのか ・他のdo-whileではなぜ起こっていないのか について教えていただけると嬉しいです。 do //販売日付入力・判定 { printf("販売日付の入力をしてください:"); fflush(stdout); scanf("%s", inHanbaibi); if(strlen(inHanbaibi) == hanbaibi) { for(i = 0; i < strlen(inHanbaibi); i++) //文字列の種類確認 { printf("%d", strlen(inHanbaibi)); if(inHanbaibi[i] >= '0' && inHanbaibi[i] <= '9') //全て数値かどうか { strJudge++; } } if (strJudge + 1 == strlen(inHanbaibi)) //全ての文字列の中の数値が指定された桁あるか { printf("販売日付が入力されました。\n\n"); judge = 1; } else { printf("入力が不正です。もう一度入力してください。\n\n"); } } else { printf("入力が不正です。もう一度入力してください。\n\n"); } }while(judge != 1);

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <String.h> 4 5 6//宣言 7int byte = 64; //テーブルのバイトサイズ 8int column = 1000; //テーブルの件数 9int ID = 4; //ID 10int hanbaibi = 8; //販売日 11int meisyo = 36; //名称 12int kingaku = 8; //金額 13int kosu = 8; //個数 14char table[1000][64]; //データテーブル 15 16//テーブル追加 17void tableAdd(char input[], int n, int m) 18{ 19 int i; 20 int start; 21 int inByte; 22 int hanbaibiStart; 23 hanbaibiStart = ID + hanbaibi - 1; 24 int meisyoStart; 25 meisyoStart = hanbaibiStart + meisyo; 26 int kingakuStart; 27 kingakuStart = meisyoStart + kingaku; 28 int kosuStart; 29 kosuStart = kingakuStart + kosu; 30 31 if(m == 1) //それぞれのインプットデータに対するスタートポイントを算出・インプットテーブルデータサイズ算出 32 { 33 start = hanbaibiStart; 34 inByte = hanbaibi; 35 } 36 else if(m == 2) 37 { 38 start = meisyoStart; 39 inByte = meisyo; 40 } 41 else if(m == 3) 42 { 43 start = kingakuStart; 44 inByte = kingaku; 45 } 46 else if(m == 4) 47 { 48 start = kosuStart; 49 inByte = kosu; 50 } 51 52 for(i = 0; i < strlen(input); i++) 53 { 54 table[n][start + inByte] = input[strlen(input) - i]; 55 } 56} 57 58 59//データテーブルの初期化 60int Init() 61{ 62 printf("テーブルの作成を判定します。\n"); 63 //テーブルが作成できているか判定 1:成功 0:失敗 64 if(sizeof table == byte * column) 65 { 66 printf("テーブルは作成されています。\n\n"); 67 int i; 68 int j; 69 //ID初期化 70 for(i = 0; i < byte; i++) 71 { 72 for(j = 0; j < ID; j++) 73 { 74 table[i][j] = '0'; 75 } 76 } 77 printf("全てのIDを初期化しました。\n"); 78 //販売日付初期化 79 for(i = 0; i < byte; i++) 80 { 81 for(j = ID; j < hanbaibi; j++) 82 { 83 if(j < hanbaibi - 2) 84 { 85 table[i][j] = ' '; 86 } 87 else if(j == hanbaibi - 2) 88 { 89 table[i][j] = '\'; 90 } 91 else if(j == hanbaibi - 1) 92 { 93 table[i][j] = '0'; 94 } 95 } 96 } 97 printf("全ての販売日付を初期化しました。\n"); 98 //名称初期化 99 for(i = 0; i < byte; i++) 100 { 101 for(j = hanbaibi; j < meisyo; j++) 102 { 103 if(j < meisyo - 2) 104 { 105 table[i][j] = ' '; 106 } 107 else if(j == meisyo - 2) 108 { 109 table[i][j] = '\'; 110 } 111 else if(j == meisyo - 1) 112 { 113 table[i][j] = '0'; 114 } 115 } 116 } 117 printf("全ての名称を初期化しました。\n"); 118 //金額初期化 119 for(i = 0; i < byte; i++) 120 { 121 for(j = meisyo; j < kingaku; j++) 122 { 123 if(j < kingaku - 2) 124 { 125 table[i][j] = ' '; 126 } 127 else if(j == kingaku - 2) 128 { 129 table[i][j] = '\'; 130 } 131 else if(j == kingaku - 1) 132 { 133 table[i][j] = '0'; 134 } 135 } 136 } 137 printf("全ての金額を初期化しました。\n"); 138 //個数初期化 139 for(i = 0; i < byte; i++) 140 { 141 for(j = kingaku; j < kosu; j++) 142 { 143 if(j < kosu - 2) 144 { 145 table[i][j] = ' '; 146 } 147 else if(j == kosu - 2) 148 { 149 table[i][j] = '\'; 150 } 151 else if(j == kosu - 1) 152 { 153 table[i][j] = '0'; 154 } 155 } 156 } 157 printf("全ての個数を初期化しました。\n"); 158 return 1; 159 } 160 else 161 { 162 printf("テーブルの作成ができていません。\n\n"); 163 return 0; 164 } 165} 166 167//データの登録 168int Add() 169{ 170 int i; 171 int breakpoint = 0; //ID"0000"の判定用 + ループ抜け出し 172 char inHanbaibi[8]; //インプット販売日付 173 char inMeisyo[36]; //インプット名称 174 char inKingaku[8]; //インプット金額 175 char inKosu[8]; //インプット個数 176 int judge = 0; //入力値の判定用 177 int strJudge = 0; //入力文字列の正否判定用 178 179 printf("追加できるテーブルを探索します。\n\n"); 180 for(i = 0; breakpoint != 1; i++) //テーブルの前からID"0000"を探索 181 { 182 if(table[i][0] == '0' && table[i][1] == '0' && table[i][2] == '0' && table[i][3] == '0') //ID"0000"の判定 183 { 184 breakpoint = 1; 185 } 186 } 187 188 if(breakpoint == 1) //ID"0000"があるとき 189 { 190 printf("追加できるテーブルがあります。\nテーブルを追加します。\n\n"); 191 192 do //販売日付入力・判定 193 { 194 printf("販売日付の入力をしてください:"); 195 fflush(stdout); 196 scanf("%s", inHanbaibi); 197 if(strlen(inHanbaibi) == hanbaibi) 198 { 199 for(i = 0; i < strlen(inHanbaibi); i++) //文字列の種類確認 200 { 201 printf("%d", strlen(inHanbaibi)); 202 if(inHanbaibi[i] >= '0' && inHanbaibi[i] <= '9') //全て数値かどうか 203 { 204 strJudge++; 205 } 206 } 207 printf("%d", strlen(inHanbaibi)); 208 209 if (strJudge + 1 == strlen(inHanbaibi)) //全ての文字列の中の数値が指定された桁あるか 210 { 211 printf("販売日付が入力されました。\n\n"); 212 judge = 1; 213 } 214 else 215 { 216 printf("入力が不正です。もう一度入力してください。\n\n"); 217 } 218 } 219 else 220 { 221 printf("入力が不正です。もう一度入力してください。\n\n"); 222 } 223 }while(judge != 1); 224 225 judge = 0; 226 strJudge = judge; 227 do //名称入力・判定 228 { 229 printf("名称の入力をしてください:"); 230 fflush(stdout); 231 scanf("%s", inMeisyo); 232 if(strlen(inMeisyo) <= meisyo) 233 { 234 printf("名称が入力されました。\n\n"); 235 judge = 1; 236 } 237 else 238 { 239 printf("入力が不正です。もう一度入力してください。\n\n"); 240 } 241 }while(judge != 1); 242 243 judge = 0; 244 strJudge = judge; 245 do //金額入力・判定 246 { 247 printf("金額の入力をしてください:"); 248 fflush(stdout); 249 scanf("%s", inKingaku); 250 if(strlen(inKingaku) <= kingaku) 251 { 252 for(i = 0; i < strlen(inKingaku); i++) //文字列の種類確認 253 { 254 if(inKingaku[i] >= '0' && inKingaku[i] <= '9') //全て数値かどうか 255 { 256 strJudge++; 257 } 258 } 259 260 if (strJudge == strlen(inKingaku)) //全ての文字列の中の数値が指定された桁あるか 261 { 262 printf("金額が入力されました。\n\n"); 263 judge = 1; 264 } 265 else 266 { 267 printf("入力が不正です。もう一度入力してください。\n\n"); 268 } 269 } 270 else 271 { 272 printf("入力が不正です。もう一度入力してください。\n\n"); 273 } 274 }while(judge != 1); 275 276 judge = 0; 277 strJudge = judge; 278 do //個数入力・判定 279 { 280 printf("個数の入力をしてください:"); 281 fflush(stdout); 282 scanf("%s", inKosu); 283 if(strlen(inKosu) <= kosu) 284 { 285 for(i = 0; i < strlen(inKosu); i++) //文字列の種類確認 286 { 287 if(inKosu[i] >= '0' && inKosu[i] <= '9') //全て数値かどうか 288 { 289 strJudge++; 290 } 291 } 292 293 if (strJudge == strlen(inKosu)) //全ての文字列の中の数値が指定された桁あるか 294 { 295 printf("個数が入力されました。\n\n"); 296 judge = 1; 297 } 298 else 299 { 300 printf("入力が不正です。もう一度入力してください。\n\n"); 301 } 302 } 303 else 304 { 305 printf("入力が不正です。もう一度入力してください。\n\n"); 306 } 307 }while(judge != 1); 308 309 printf("空白のテーブルを確認しました。\nIDを追加します。\n"); 310 311 i++; 312 if(i / 1000 == 0) //1000の位判定 313 { 314 table[i][0] = ' '; 315 } 316 else 317 { 318 table[i][0] = i / 1000; 319 } 320 321 i -= ((i / 1000) * 1000); //最上位桁減らし 322 if(i / 1000 == 0 && i / 100) //100の位判定 323 { 324 table[i][1] = ' '; 325 } 326 else 327 { 328 table[i][1] = i / 100; 329 } 330 331 i -= ((i / 100) * 100); //最上位桁減らし 332 if(i / 1000 == 0 && i / 100 && i / 10) //10の位判定 333 { 334 table[i][2] = ' '; 335 } 336 else 337 { 338 table[i][2] = i / 10; 339 } 340 341 i -= ((i / 10) * 10); //最上位桁減らし 342 table[i][3] = i / 1; //1の位入力 343 i--; 344 345 tableAdd(inHanbaibi, i, 1); 346 tableAdd(inMeisyo, i, 2); 347 tableAdd(inKingaku, i, 3); 348 tableAdd(inKosu, i, 4); 349 return 1; 350 } 351 else //ID'0000'のテーブルが無い場合 352 { 353 printf("全てのテーブルが埋まっている、もしくは、異常を検知しました。\n\n"); 354 return 0; 355 } 356} 357 358//データの削除・未完 359int Delete() 360{ 361 printf("Delete comp\n"); 362 return 0; 363} 364 365//メイン 366int main(void) 367{ 368 int result; 369 370 result = Init(); 371 if(result != 1) 372 { 373 printf("テーブルの初期化に失敗しました。\n\n"); 374 } 375 else 376 { 377 printf("テーブルの初期化に成功しました。\n\n"); 378 } 379 380 printf("テーブルの追加をします。\n\n"); 381 result = Add(); 382 if(result != 1) 383 { 384 printf("テーブルの追加に失敗しました。\n\n"); 385 } 386 else 387 { 388 printf("テーブルの追加に成功しました。\n\n"); 389 } 390 getchar(); 391 392 return 0; 393} 394

補足情報(FW/ツールのバージョンなど)

visual studio code

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

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

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

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

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

guest

回答1

0

ベストアンサー

char inHanbaibi[8]; //インプット販売日付

文字列としては、ここには7文字分しかいれることはできません
それを8文字とか9文字というのは、どこかでアクセス違反を起こしてます

投稿2021/05/29 08:17

y_waiwai

総合スコア88042

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

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

AbeshiGF

2021/05/29 08:22

ありがとうございます。 とりあえず全ての配列の量を256にしたら正常に動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問