'C언어'에 해당되는 글 3건

  1. 2010.09.11 [C] Entering strings including <space>
  2. 2010.06.14 [C] Pseudorandom number generator
  3. 2010.04.26 C언어 달팽이(나선)배열 7
Conway's Game of Life라는 글에 올린 코드를 실행시켜보면 파일 경로를 입력하라는 창이 뜬다. 물론 파일 경로에 빈칸(space)이 들어가도 되도록 만들었다.[각주:1] scanf로는(%s를 이용한 경우) 빈칸이 포함된 string을 읽지 못하기 때문에 다른 함수를 이용해야 한다. 링크된 글의 코드에서 빈칸이 포함된 string을 읽는 함수만 가져왔다.

int locate(char loc[])
{
    int i;
    printf("File location(length at most %d):\n", maxpath);
    while(1)//loop until input is proper
    {
        for(i=0;i<=maxpath;i++) loc[i]=0;//initialize string
        gets(loc);
        if(loc[0]) break;
    }
    if(loc[maxpath]!=0) {printf("Path is too long.\n"); return 0;}
    return 1;
}

main함수에서 이 함수에 집어넣을 array의 크기를 char location[maxpath+1]으로 선언했기 때문에 에러가 나지는 않는다. 다음은 main함수의 첫 부분.

int main()//main function
{
    int i,time;
    char a[scale*scale]={},loc[maxpath+1]={}, cell[2];

...


조금 생소한(?) gets라는 함수가 하나 보이는데 이 녀석은 return(new line)이 나타날 때까지 글자를 전부 읽고 string에 저장하는 역할을 한다. 문제는 gets가 쓰이기 전에 scanf가 쓰였을 경우이다. scanf는 new line이 있으면 그 전까지만 읽기 때문이다. 아직 new line이 메모리에 남아있기 때문에 gets 함수는 newline을 읽는다. 의도치 않게 자동으로(?) 입력되어 버리는 것이다. 그걸 막기 위해서 loop를 이용했다.

이렇게 input이 꼬인다는 것도 문제이기는 하지만, 사실 가장 큰 문제는 구해 놓은 메모리보다 더 큰 정보를 저장할 때 생긴다. gets 함수를 쓰면 프로그램이 지정해놓은 공간 '밖에도' 저장이 되기 때문에 엉뚱한 정보가 날아갈 위험이 있는 것이다. 때문에 보통은 fgets 함수를 쓰는 것이 더 안전하다고 한다. 알아서 응용해 보시길 ㅇ-ㅇ
  1. "C:\my documents and settings\my documents\abc.txt" 와 같은 string을 사용자가 입력하도록 만들었다. [본문으로]

'Programme' 카테고리의 다른 글

Reversible Computation  (0) 2013.10.29
[C] Conway's Game of Life  (4) 2010.06.25
[C] Pseudorandom number generator  (0) 2010.06.14
C언어 달팽이(나선)배열  (7) 2010.04.26
Posted by 덱스터
대충 인터넷 뒤져가면서 만든 녀석. 그럭저럭 잘 작동하는듯...

#include "time.h"

unsigned long random(unsigned long i)//do not use 0 as seed
{
if(i && time(0)%2)
return (unsigned long)(i>>1)|(((i^(i>>10)^(i>>30)^(i>>31))&1)<<31);
else return (unsigned long)(i*1103515245+12345)%0x100000000;
}

주의할 점은 첫 seed value로 0을 넣지는 말라는 것. 위쪽 알고리즘(LCG)은 문제없이 작동하더라도 아래쪽 알고리즘(LFSR)은 0이 들어가면 0만 나온다. -_-;;

seed value로 0이 들어가도 되도록 수정. 대신에 순서가 바뀌었네...

Mersenne  twister는 써보려고 했는데 너무 길어서 포기 -_-;;;

'Programme' 카테고리의 다른 글

Reversible Computation  (0) 2013.10.29
[C] Entering strings including <space>  (0) 2010.09.11
[C] Conway's Game of Life  (4) 2010.06.25
C언어 달팽이(나선)배열  (7) 2010.04.26
Posted by 덱스터
컴퓨터 수업 과제. 과제 제출기한 종료에 맞추어 공개.

#include <stdio.h>

int main()
{
int i,j=1,k=1,l=1,n,a[19][19];
printf("n<19\?");scanf("%d", &n);
for(i=0;i<n*n;i++)
{
a[j-1][k-1]=i+1;
if(j==l&&k!=n-l+1)k++;
else if(j!=n-l+1&&k==n-l+1)j++;
else if(j==n-l+1&&k!=l)k--;
else j--;
if(j==k&&k==l){l++;j++;k++;};
}
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
{
printf("%4d", a[j][k]);
}
printf("\n");
}
return 0;
}

출력 결과

미니멀리즘은 진리. 그런데 해 놓은 것을 살펴보니까 좀 더 줄일 수 있을 것 같다. 구문 자체는 변하지 않겠지만.

'Programme' 카테고리의 다른 글

Reversible Computation  (0) 2013.10.29
[C] Entering strings including <space>  (0) 2010.09.11
[C] Conway's Game of Life  (4) 2010.06.25
[C] Pseudorandom number generator  (0) 2010.06.14
Posted by 덱스터
이전버튼 1 이전버튼

블로그 이미지
A theorist takes on the world
덱스터
Yesterday
Today
Total

달력

 « |  » 2024.11
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함