[질문]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.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.