ID非公開
ID非公開さん
2020/11/24 8:31
1回答
次のプログラムは文字列Hokkaidoを整数列78663148に変換して出力するものです。
次のプログラムは文字列Hokkaidoを整数列78663148に変換して出力するものです。 Hと7、oと8、といったように対応付けています。 実際に実行してみると786631489となり、9が1個付加されます。 これは自分が配列sで文字がないときに配列nに9を対応させたからなのですが、ここで疑問があります。 配列サイズは100と決めているので、実行結果は78663148999999999999‥となるべきではないでしょうか。 なぜこうなるのかわかる方いますか #include <stdio.h> int main(void) { char num[100], str[100]; char *n = num, *s = str; int i, size=0; printf("文字列を入力:"); scanf("%s", str); size = sizeof(str) / sizeof(*s); for (i = 0; i<size; i++) { if (*(s+i) == 'A') { *(n+i) = '0'; } else if (*(s+i) == 'i') { *(n+i) = '1'; } else if (*(s + i) == 'E') { *(n + i) = '2'; } else if (*(s + i) == 'a') { *(n + i) = '3'; } else if (*(s + i) == 'd') { *(n + i) = '4'; } else if (*(s + i) == 'J') { *(n + i) = '5'; } else if (*(s + i) == 'k') { *(n + i) = '6'; } else if (*(s + i) == 'H') { *(n + i) = '7'; } else if (*(s + i) == 'o') { *(n + i) = '8'; } else if (*(s + i) == 'u') { *(n + i) = '9'; } else if (*(s + i) == '\0') { *(n + i) = '9'; } } while (*(n+1) != '\0') { putchar(*n++); } putchar('\n'); return 0; }
ベストアンサー
配列 str は未初期化。 Cでは、ローカル変数はプログラマが明示初期化してない 場合、中味は 不定 です。 scanf("%s" は、入力文字列の終端に '\0' を置く 仕様だから、Hokkaido 直後の1文字は '\0' だけど、 str の以降の中味は不定です。 だから、たまたま中味が 0 になってない限り、 あなたの else if にはひっかからない。 str の全要素を '\0' に初期化してやれば、 結果は変わるでしょう。 char num[100], str[100]; ↓ char num[100], str[100]={0};
ID非公開
ID非公開さん
質問者
2020/11/24 16:28