세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한다. 예를 들어, 문서가 abababa이고, 그리고 찾으려는 단어가 ababa라면, 세준이의 이 함수는 이 단어를 0번부터 찾을 수 있고, 2번부터도 찾을 수 있다. 그러나 동시에 셀 수는 없다.
세준이는 문서와 검색하려는 단어가 주어졌을 때, 그 단어가 최대 몇 번 중복되지 않게 등장하는지 구하는 프로그램을 작성하시오.
첫째 줄에 문서가 주어진다. 문서의 길이는 최대 2500이다. 둘째 줄에 검색하고 싶은 단어가 주어진다. 이 길이는 최대 50이다. 문서와 단어는 알파벳 소문자와 공백으로 이루어져 있다.
첫째 줄에 중복되지 않게 최대 몇 번 등장하는지 출력한다.
문자열을 받아, 그 문자열에 특정 문자열이 몇 개 포함되어 있는지 찾는 프로그램이다. 주의할 점은, 한번 찾은 문자열에 그 뒤에 찾은 문자열이 포함되어 있다면 그 문자열은 횟수에 더하지 않는다는 것이다. 첫 번째 출력 예제를 보자.
입력 : ababababa, aba
출력 : 2
4개가 나와야 할 것 같지만, 우리는 aba를 먼저 보고 나서는 bababa만 검사하여 하나만이 더 나오게 출력해야 하는 것이다. 또한, 두 번째 출력 예제를 보자.
입력 : a a a a a
a a
출력 : 2
간단한 예제지만, 우리가 흔히 입력을 받을 때 사용하는 scanf는 띄어쓰기, 즉 공백을 입력 받을 수 없다. 그것 또한 유의해야 할 것이다.
우선 그것까지만 생각해서 코드를 짰다. 하지만, 69%에서 오답이 나왔다.

69%까지 검사가 가능했다는 것은, 반례가 어디 존재한다는 것이었고, 그 반례는 바로 이렇다:
입력 : abababc
ababc
내가 만든 코드가 낸 출력 : 0
실제 내야하는 출력 : 1
코드를 짤 때, 나는 코드가 한번이라도 검사 받았으면 그 뒤로는 검사하지 않는 코드를 짰던 것이었다. 이 말이 무엇이냐면,
위 입력에서 입력을 하나씩 검사할 때, abab"a"bc에서 걸린다. 그리고 출력하는 변수에 1을 더하지 않고 나가는데, 이때 앞의 a"b"ababc에서 시작하는 것이 아닌, ababa"b"c부터 시작하여 0개가 나오는 것이다.
시작을 b부터 시작하기로 했지만, 그렇게 되면 위에 만든 첫 번째 입력이 오류가 나 버린다. 그 문제를 해결하기 위해 그냥 배열을 하나 더 만들기로 했다. 이 배열에는 문자열을 만들었을 경우, 시작하는 문자열부터 끝나는 문자열까지 연속적으로 숫자 1을 저장하는 배열이다. 만약 새로 만든 단어가 있을 경우, 이 시작 문자열에 1이 들어가있는지를 판별하여 중복되는 위치를 제거하는 방법이다.
코드는 이렇게 구성되어 있다:
#include <stdio.h>
#include <string.h>
int main(void) {
	char document[2500]; // Array to get document(first line)
	int document_certification[2500]; // Another array to catch problem
	scanf("%[^\n]s", document);
	int length = strlen(document);
	char word[50]; // Array to get word(second line)
	scanf(" %[^\n]s", word);
	int word_Length = strlen(word);
	int isCorrect = 0; int total = 0; int j;
	for (int i = 0; i < length; i++) { // For document index search
		if (document[i] == word[0]) { // if alphabet in document is equal to alphabet in word
			isCorrect++; // Increase variable
			for (j = 1; j < word_Length; j++) { // For word index search
				if (document[i + j] == word[j]) { // if next alphabet is also equal to next alphabet in word
					isCorrect++; // Also increase variable
				}
				else { // if not equal
					break;
				}
			}
			if (isCorrect == word_Length && document_certification[i] != 1) {
				// first condition is for word correctness, and second is for word duplication
				total++;
				for (int k = i; k < i + word_Length; k++) { // if this word is definitely new world,
					document_certification[k] = 1; // change array to conferm word
				}
			}
		}
		isCorrect = 0;
	}
	printf("%d", total);
	return 0;
}
조금 주의해야 하는 사항으로, scanf 쪽의 명령어를 한번 보자.
char document[2500]; // Array to get document(first line)
int document_certification[2500]; // Another array to catch problem
scanf("%[^\n]s", document);
int length = strlen(document);
char word[50]; // Array to get word(second line)
scanf(" %[^\n]s", word);
int word_Length = strlen(word);
우선 첫 번째, 앞에서 말했듯이 scanf는 공백을 입력받을 수 없다. 그걸 해결하기 위해, 두 가지 방법이 있다.
[^\n] 사용
이것을 사용하면, 우리가 엔터를 입력할 때까지 입력한 모든 것들이 버퍼에 저장되고, 엔터를 입력하면 변수에 이 값이 저장된다. 굳이 \n이 아니라도, 이 문법을 조금 이해하면 여러 방법으로 사용할 수 있다.
1-1. \n 대신 특정 문자열을 사용한다면?
만약 [^a]라고 적었다고 가정해보자. 이렇게 쓰면, c는 a 문자가 나오기 전까지 모든 문자열을 버퍼에 저장한다고 인식한다.
입력을 yqwetnbaqwenb로 입력한다면, 출력은 a 이전의 모든 문자열인 yqwetnb만 출력하게 될 것이다.
1-2. ^를 생략한다면?
^를 생략하면, c는 a 이외의 문자가 나올 때 까지 모든 문자열을 버퍼에 저장한다고 인식한다.
입력을 aaaaaaaabbbbbb로 입력하면, 출력은 a가 나오지 않은 문자인 b의 전 부터의 모든 문자열, 즉 aaaaaaaa를 출력하게 될 것이다. 
fgets나 gets 사용
gets() 함수는 보안성이 좋지 않아서, fgets() 함수를 사용하는 것을 추천한다. 둘의 문법은 각각
gets(입력받을 변수)
fgets(입력받을 변수, 받을 크기, stdin)
로 사용하면 된다. 
둘 모두를 사용해 보았지만, 첫 번째 document를 받는 명령문은 실행되지만 두 번째 word를 받는 명령문이 실행되지 않는 문제를 발견하였다. 이 또한 해결하기 위해 찾아보니, 두 번째 word를 사용할 때 위처럼 공백을 넣어주면 받아진다는 사실을 확인하였다.
scanf(" %[^\n]s", word);
공백을 넣고 실행하면 
맞는 것을 확인할 수 있다.