実現したいこと
2 次元配列に格納された文字列の検索・入れ替えを行うプログラムを作成。
前提
c言語に関する質問です。
上記を実現するためのソースコードを作成したのですが、理想通りの実行結果にならないのでアドバイスお願いします。
発生している問題・エラーメッセージ
./a.out 0: Yokosuka 1: Chigasaki 2: Fujisawa 3: Yokohama 4: Hiratsuka 5: Sagamihara 処理の入力(1: 検索 2: 入れ替え 0: 終了)> 2 一つ目の位置の入力> 1 二つ目の位置の入力> 3 0: Yokosuka 1: Yokohama Fujisawa :⑴ 2: Fujisawa 3: Chigasaki 4: Hiratsuka 5: Sagamihara 処理の入力(1: 検索 2: 入れ替え 0: 終了)> ⑴が問題の部分です。 列の入れ替えを行った際、なぜか変な位置に配列内の文字が表示される。
該当のソースコード
C
1#include <stdio.h> 2#include <string.h> 3 4#define WLEN 20 5#define WNUM 6 6 7int main() { 8 char words[WNUM][WLEN] = {"Yokosuka", "Chigasaki", "Fujisawa", 9 "Yokohama", "Hiratsuka", "Sagamihara"}; 10 int command; /* 選択処理管理用変数 */ 11 12 /* 変数宣言の追加 */ 13 char search[WLEN]; 14 int pos1, pos2, i, j, match; 15 16 while (1) { 17 printf("\n"); /* 文字列(2次元配列)の出力が見やすいように1行空白行を出力 */ 18 19 /* 文字列(2次元配列)の出力) */ 20 for (i = 0; i < WNUM; i++) { 21 printf("%d: %s\n", i, words[i]); 22 } 23 /* コマンドの入力 */ 24 printf("\n処理の入力(1: 検索 2: 入れ替え 0: 終了)> "); 25 scanf("%d", &command); 26 27 switch (command) { 28 case 1: /* 検索処理 */ 29 printf("検索文字列の入力> "); 30 /* 標準入力からの検索文字列の読み込み */ 31 scanf("%s", search); 32 /* 文字列の検索処理 */ 33 for (i = 0; i < WNUM; i++) { 34 match = 0; 35 for (j = 0; j < WLEN - strlen(search); j++) { 36 if (words[i][j] == search[0]) { 37 match = 1; 38 for (int k = 1; k < strlen(search); k++) { 39 if (words[i][j + k] != search[k]) { 40 match = 0; 41 break; 42 } 43 } 44 if (match == 1) { 45 printf("%d 番目の文字列の%d文字目から一致\n", i, j + 1); 46 } 47 } 48 } 49 } 50 break; 51 case 2: /* 入れ替え処理 */ 52 printf("一つ目の位置の入力> "); 53 /* 標準入力からの一つ目の位置の読み込み*/ 54 scanf("%d", &pos1); 55 56 printf("二つ目の位置の入力> "); 57 /* 標準入力からの二つ目の位置の読み込み */ 58 scanf("%d", &pos2); 59 /* 文字列の入れ替え処理 */ 60 char temp[WLEN]; 61 62 int len1 = strlen(words[pos1]); 63 int len2 = strlen(words[pos2]); 64 int len = (len1 < len2) ? len1 : len2; 65 char ch; 66 67 for (int i = 0; i < len; i++) { 68 ch = words[pos1][i]; 69 70 words[pos1][i] = words[pos2][i]; 71 words[pos2][i] = ch; 72 } 73 74 if (len1 != len2) { 75 char *longer; 76 char *shorter; 77 78 if (len1 > len2) { 79 longer = words[pos1]; 80 shorter = words[pos2]; 81 } else { 82 longer = words[pos2]; 83 shorter = words[pos1]; 84 } 85 for (i = len; i < WLEN; i++) { 86 shorter[i] = longer[i]; 87 longer[i] = ' '; 88 } 89 } 90 break; 91 case 0: /* 処理の終了 */ 92 printf("\n"); 93 return 0; 94 break; 95 } 96 } 97 98 return -1; 99} 100
補足情報(FW/ツールのバージョンなど)
VScode (最新ver)
ここにより詳細な情報を記載してください。

回答2件
あなたの回答
tips
プレビュー