시작 -> 실행 -> cmd를 쳐보자. 검정 화면이 눈에 보인다. 여기서 dir이라고 치면 그 디렉토리에 있는 서브디렉토리와 파일이 모두 나온다. 이 때 원하는 파일을 찾으려면 다음과 같이 하면 된다.
dir *.exe라고 치면 확장자가 exe인 파일이 다 나온다. "dir 패턴"과 같이 치면 그 패턴에 맞는 파일만 검색 결과로 나온다. 예를 들어, dir a?b.exe라고 검색하면 파일명의 첫 번째 글자가 a이고, 세 번째 글자가 b이고, 확장자가 exe인 것이 모두 나온다. 이 때 두 번째 문자는 아무거나 나와도 된다. 예를 들어, acb.exe, aab.exe, apb.exe가 나온다.
이 문제는 검색 결과가 먼저 주어졌을 때, 패턴으로 뭘 쳐야 그 결과가 나오는지를 출력하는 문제이다. 패턴에는 알파벳과 "." 그리고 "?"만 넣을 수 있다. 가능하면 ?을 적게 써야 한다. 그 디렉토리에는 검색 결과에 나온 파일만 있다고 가정하고, 파일 이름의 길이는 모두 같다.
첫째 줄에 파일 이름의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에는 파일 이름이 주어진다. N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다. 파일이름은 알파벳과 "." 그리고 "?"로만 이루어져 있다.
첫째줄에 패턴을 출력하면 된다.
#include <stdio.h>
int main(void)
{
int a, b, n, s = 0;
char str[50][51];
scanf("%d", &n);
for (a = 0; a < n; a++) scanf("%s", str[a]);
while (str[0][s] != '\0') s++;
for (a = 0; a < n; a++)
{
for (b = 0; b < s; b++)
{
if (str[a][b] != str[a+1][b]) str[a+1][b] = '?';
}
}
printf("%s", str[n - 1]);
return 0;
}
런타임 에러 계속 뜬다
아까 유동이 while에 왜 공백 처넣었냐고 했었는데
그거 맨처음 했을때 잘못쳤던 코드엿고
\0 해도 런타임 에러는 계속 뜨더라고
for (a = 0; a < n; a++) 을 for (a = 1; a < n; a++)으로 고치고 a + 1 말고 a - 1으로 코드를 고쳐봐라
a + 1 을 쓰면 a == 2일때 3을 참조하는데 3에는 아무것도 없잖아.
그래도 컴파일 에런데..
에러가 뜨면 제발 에러 내용을 올려라
시발
런타임 에러라니깐 이거 백준 문제인데 컴파일러에서는 존나 잘 작동하는데 제출하면 런타임에러 이렇게만 뜨고 안된다
... 런타임 에러가 뜨는게 맞습니다.
저기 버그가 있네요.
$ valgrind --tool=memcheck ./main==6122== Memcheck, a memory error detector==6122== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.==6122== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info==6122== Command: ./main==6122== 3config.tectconfigconfCheck value. n[3]Check input message. message[0:config.tect]Check input message. message[1:config]Check input
http://ideone.com/oavSpo
메모리 초기화 & 문자열 비교 버그 였네요.. -_-;;;
변수를 선언하고 사용하기 전에는 반드시 memset 으로 초기화를 하고 사용하는 습관을 기르시면 도움이 될 겁니다.
그리고, 문자열 비교시 ' ' 이 아니라 0x00(NULL) 값을 비교하도록 하도록 수정하시면 되구요. :)
그런데, 보통은 저런 경우 0x00 값을 찾기 보다는 strlen() 함수를 이용합니다. ;)