일반
2012.02.06 08:12

디버깅용 string 프로그램 소스

조회 수 15612 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
Practice of Programming 에서 발췌.

바이너리 파일에서 6자 이상의 문자열을 모두 출력해주는 프로그램.

 /* Copyright (C) 1999 Lucent Technologies */
/* Excerpted from 'The Practice of Programming' */
/* by Brian W. Kernighan and Rob Pike */

#include <stdio.h>
#include <ctype.h>
#include "eprintf.h"

void strings(char *, FILE *);

enum { MINLEN = 6 };

/* strings main: find printable strings in files */
int main(int argc, char *argv[])
{
    int i;
    FILE *fin;

    setprogname("strings");
    if (argc == 1)
        eprintf("usage: strings filenames");
    else {
        for (i = 1; i < argc; i++) {
            if ((fin = fopen(argv[i], "rb")) == NULL)
                weprintf("can't open %s:", argv[i]);
            else {
                strings(argv[i], fin);
                fclose(fin);
            }
        }
    }
    return 0;
}

/* strings: extract printable strings from stream */
void strings(char *name, FILE *fin)
{
    int c, i;
    char buf[BUFSIZ];

    do {    /* once for each string */
        for (i = 0; (c = getc(fin)) != EOF; ) {
            if (!isprint(c))
                break;
            buf[i++] = c;
            if (i >= BUFSIZ)
                break;
        }
        if (i >= MINLEN) /* print if long enough */
            printf("%s:%.*s\n", name, i, buf);
    } while (c != EOF);
}



 

/* eprintf.h: 에러 wrapper 함수 제공 */

extern void eprintf(char *fmt, ...);
extern void weprintf(char *fmt, ...);
extern char *estrdup(char *s);
extern void *emalloc(size_t n);
extern void setprogname(char *str);
extern char *progname(void);



 

#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include "eprintf.h"|

/* 
 eprintf: 에러 메시지를 출력하고 프로그램을 종료한다. 
*/
void eprintf(char *fmt, ...)
{
 va_list args;

 fflush(stdout);
 if(progname() != NULL)
  fprintf(stderr, "%s: ", progname());

 va_start(args, fmt);
 vfprintf(stderr, fmt, args);
 va_end(args);

 if (fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':')
  fprintf(stderr, "%s", strerror(errno));
 fprintf(stderr, "\n");
 exit(2); /*프로그램이 실패하는 경우의 관습적인 값*/
}

void weprintf(char *fmt, ...)
{
 va_list args;

 fflush(stdout);
 if(progname() != NULL)
  fwprintf(stderr, "%s: ", progname());

 va_start(args, fmt);
 vfwprintf(stderr, fmt, args);
 va_end(args);

 if (fmt[0] != '\0' && fmt[wcslen(fmt)-1] == ':')
  fwprintf(stderr, "%s", strerror(errno));
 fwprintf(stderr, "\n");
 exit(2); /*프로그램이 실패하는 경우의 관습적인 값*/
}


/* 
 estrdup: 문자열을 복사하고 에러 발생시 종료
*/
char *estrdup(char *s)
{
 char *t;

 t = (char*) malloc(strlen(s)+1);
 if (t == NULL)
  eprintf("estrdup(\"%.20s\") failed:", s);
 strcpy(t, s);
 return t;
}

/* 
 emalloc: 메모리를 할당하고, 에러 발생시 종료
*/
void *emalloc(size_t n)
{
 void *p;

 p = malloc(n);
 if (p == NULL)
  eprintf("malloc of %u bytes failed:", n);
 return p;
}

static char *name = NULL; // 메시지 출력을 위한 이름
/* 
 setprognmae: 프로그램 이름 지정
*/
void setprogname(char *str)
{
 name = estrdup(str);
}

/* 
 progname: 저장된 프로그램 이름 리턴
*/
char *progname(void)
{
 return name;
}


 


Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
371 PHP GD 및 이미지 함수 정리 2014.07.09 12916 0
370 Android gdb commands 2015.03.11 7807 0
369 LINUX gdb 쓸때 상용구 secret 2019.06.26 0 0
368 Android Gerrit 검색 쿼리 도움말 2012.04.30 18683 0
367 Android git archive 를 사용해서 폴더를 .git 제외하고 tar 나 zip 으로 묶기 1 2019.02.10 7506 0
366 Android git log 옵션들 2015.01.09 29365 0
365 Android git 기초 - 원격 저장소 만들고 로그인하기, 소스 되돌리기 2016.10.29 11457 0
364 Android Git 사용자 설명서 2012.04.24 16180 0
363 Android Git 특정 commit 상태로 되돌리고 SHA1 값 알아내기 2015.05.13 6390 0
362 Python Google Colab에서 파일 업로드/다운로드 팁 2019.03.06 36857 0
361 업무 H&A본부 교육 중 IoT / 로봇 관련 내용 secret 2016.08.29 0 0
360 C# Hashtable 정렬하기 2012.12.11 15941 0
359 PHP Header for XML content in PHP file 2014.06.02 11484 0
358 개념 HLS(HTTP Live streaming) 2012.02.01 33062 0
357 Android How to create OMA DRM v1.0 content 2012.05.24 13377 0
목록
Board Pagination ‹ Prev 1 ... 5 6 7 8 9 10 11 12 13 14 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5