[질문]c언어 문자 읽어들이는 부분에서 쓰레기글자들이 추가됩니

boardholic의 이미지

#include <stdio.h>
#include <string.h>
#include <conio.h>

#define TRUE 1
#define FALSE 0

typedef struct data{
            char label[8];
            char opCode[6];
            char operand[18];
            char comment[31];
            char comnt[66];
            };
            

void readSrce();
char buffer[66];

main()
{
    data srcLine;
    int i;
    char c;
    readSrce();
    
    if(buffer[0]=='.')
        strcpy(srcLine.comnt,buffer);
    else if(buffer[0] >= 'A' && buffer[0] <= 'Z')
        strncpy(srcLine.label,buffer,8);
             
    else
        return 0;
    printf("label=%s\n",srcLine.label);

    while(!kbhit());
 }
 
 void readSrce()
 {
   FILE *fp;
   fp=fopen("srcFile.txt","r");
   fgets(buffer,66,fp);
 }

아직 시작하는 부분인데 여기서 strncpy로 buffer의 8글자만
입력 받아서 저장할려고 하는데 저장하고 출력하면 쓸데없는 글자들도 같이 출력됩니다. 왜그런걸가요 -.-[/code]

Necromancer의 이미지

printf()의 %s는 NULL을 문자열 끝으로 인식합니다. 아마 이걸 빼먹은거 같군요.

NULL = 0인건 아시겠죠.

Written By the Black Knight of Destruction

boardholic의 이미지

헉 너무 오랜만에 하다보니까 기본적인것도 까먹었었네요.ㅜ.ㅜ..

감사합니다.^^*

나에게 있어 한계란 없다.
무한한 꿈을향해 나아간다.

오호라의 이미지

스트링 처리시 알아야 할 몇가지.

[End Condition]을 명확히 하라.
- NIL, NULL...등의 문자열의 끝을 표현할수 있는 방법이 있어야 합니다. 그리고, 본인이 쓰고자 하는 함수(ex. printf("%s"), strcpy())들의 방식도 알아야 합니다. 관례상 NULL을 문자열의 끝으로 표시합니다.

메모리를 항상 의심해라!
- 메모리는 쓰기 전에도, 쓰고 난후에도 관리해여야 합니다. 파일열고, 쓰고, 여러가지에 익숙해질 쯤 음지에서 그 모습을 감추고 있다. 슬그머니 그 모습을 드러내죠.
ex) 쓰기전에 Clean, 쓰고 난후에도 Clean!! 약간의 오버헤드가 있더라도 데이터의 무결성을 위하여...

정해진 루트로의 접근만 허용해라.
- char buffer[10]라면 buffer 또는 char* ptr = buffer와 같이 그 루트가 항상 동일하고, 명확하고, 되도록이면 처음부터 이루어져야 합니다. 부득이하게 중간을 포인터해서 읽어야 한다면. const로 접근 해야 합니다. 물론 포인터시 const로 접근하면 좋습니다. 그리고, 포인터의 처리도 확실히 해야 합니다.

이것말고 몇가지 더 있으나 생략...^^;

오. 모든게 귀차니즘에 반한다면...(#ifdef, #ifndef)와 같은 디버그모드와 릴리즈모드로 따로 동작할수 있게 만드는 것을 추천합니다.

이것도 귀차니즘에 반한다면...제일 좋은 방법이지만...아는 길로만 가는 방법입니다. 본인이 잘 input, output을 잘알고 있는 함수만 쓰고, 메모리, 스트링...자신이 잘 다룰수 있는 방법으로만 쓰는겁니다. 이것 또한 한가지의 최적의 방법입니다. 편하더라도 모르는 함수를 쓰다보면 자신도 모르는 side effect에 직면할수 있습니다. 돌아가도 아는 길로만 간다. 이것도 정석의 하나가 아닐지...

Hello World.