#include <stdio.h>
int main(void) {
char word[100];
int len=0;
printf("영단어 하나 써라 : \n\n");
scanf_s("%s", word);
while (word[len] != '\0')
len++;
printf("입력한 영단어의 길이는 : %d", len);
return 0;
}
위 코드가 실행되지 않았다. 아주 약간의 답지를 참고하여 구현했지만, scanf_s의 문제로 해결이 되지 않았음을 발견했다.
https://blog.naver.com/wiiwiwi/222843836892
버퍼 오버플로우 : 버퍼의 한계가 있어도 일단 처리가 급하니까 다른 곳에 남겨두는 것, 출력은 잘 되지만 나중에 문제가 될 수 있다.
scanf가 버퍼 오버플로우가 일어난다고 한다. 반면에 scanf_s는 버퍼 오버플로우가 없다. 대신 버퍼를 벗어나면 저장을 하지 않는다.
이에 대한 해결 방법은
#define _CRT_SECURE_NO_WARNINGS
를 선언하고 scanf를 사용하면 된다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
char word[100];
int len=0;
printf("영단어 하나 써라 : \n\n");
scanf("%s", word);
while (word[len] != '\0')
len++;
printf("입력한 영단어의 길이는 : %d", len);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
char word[100];
int len = 0;
int temp;
printf("영단어 하나 써라 : ");
scanf("%s", word);
while (word[len] != 0)
len++;
for (int a = 0; a <= len; a++) //뒤집고 또 뒤집는 꼴
{
temp = word[a];
word[a] = word[len-a];
word[len-a] = temp;
}
printf("\n\n");
printf("%s", word);
return 0;
}
결과가 나오지 않았다. 일단 for문에서 조건식에 a<=len 에서 2을 나눠줬어야 했다. 나누지 않는다면 한 번 뒤집었다가 다시 뒤집는 꼴이기 때문이다.
그리고, len-a 에 -1을 더 해줬어야 했다. 왜냐? len은 index의 번호이기 때문이다. 즉, 위의 코드는 널 문자와 첫 번째 문자를 바꾼 셈이다. 그래서 결과가 안나왔던 것이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
char word[100];
int len = 0;
int temp;
printf("영단어 하나 써라 : ");
scanf("%s", word);
while (word[len] != 0)
len++;
for (int a = 0; a <= len/2; a++) {
temp = word[a];
word[a] = word[(len-a)-1];
word[(len-a)-1] = temp;
}
printf("\n\n");
printf("%s", word);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char voca[100];
int len = 0, i;
char max = 0;
printf("영단어 입력 : ");
scanf("%s", voca);
while (voca[len] != '\0')
len++;
for (i = 0; i < len; i++)
if (max < voca[i])
max = voca[i];
printf("가장 큰 아스키코드 : %c\n", max);
return 0;
}
for (i = 0; i < len; i++)
if (max < voca[i])
max = voca[i];
이 부분에서 아스키코드 끼리 비교한다. max의 자료형도 char이기 때문이다.
아주 유용한 정보네요!