HelloW さんが書きました: ↑5年前
考えましたが、どんな場合に上記の動作をしないのかがわからないので、教えてください。
char S[102]; は初期化されていないので、何が入っているかわかりません。
scanf("%s", S); で abc を入力すると、
S[0] = 'a', S[1] = 'b', s[2] = 'c', s[3] = '\0' と
先頭 4バイトだけ値が設定されます。
残りの S[5]~S[101] の 98バイトに 'I', 'i', 'l' が
入っている可能性があります。
その場合、sizeof(S) を使って配列全体を探索すると、
入力の abc に Iil が含まれていないにもかかわらず
caution が表示されてしまいます。
入力文字列の最後で探索を終了するために次のように変更してください。
コード:
for (int i = 0; S[i] != '\0'; i++)
また、最初の forループで Iil の有無が分かるので、
二度目の forループは要りません。
コード:
#include <stdio.h>
#include <stdlib.h> // system
int main(void)
{
char S[102];
scanf("%s", S);
int i;
for (i = 0; S[i] != '\0'; i++) {
if (S[i] == 'i' || S[i] == 'l' || S[i] == 'I') {
printf("caution");
break;
}
}
if (S[i] == '\0') printf("%s", S);
printf("\nstop");
system("pause");
return 0;
}
さらに、<string.h> には strpbrk という関数があるので、
次のように書くこともできます。
コード:
#include <stdio.h> // scanf, puts, printf
#include <string.h> // strpbrk
#include <stdlib.h> // system
int main(void)
{
char S[102];
if (scanf("%101s", S) != 1) return 1;
puts(strpbrk(S, "iIl") ? "caution" : S);
printf("stop");
system("pause");
return 0;
}