일반
2012.02.06 08:12

디버깅용 string 프로그램 소스

조회 수 15675 댓글 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
번호 분류 제목 날짜 조회 수 추천 수
416 일반 BT와 BLE 2017.05.16 6916 0
415 LINUX [Shell Script] Bash 파일 유무 체크하는 방법과 파일 존재 검사 옵션 2017.05.16 21618 0
414 LINUX [Shell Script] Bash 실행결과를 변수에 담기 2017.05.16 13696 0
413 Pi SSD1306 OLED Displays with Raspberry Pi 2017.05.10 6994 0
412 Pi SPI란? (Serial Peripheral Interface) 2017.04.20 15843 0
411 Pi LCD interface 종류 및 Driver IC 2017.04.17 6569 0
410 Pi 아두이노의 인터럽트 (interrupt) 사용 2017.04.13 14719 0
409 JAVA [Java] 자바에서 콜백(Callback) 구현하기 2017.03.15 26402 0
408 Android json 데이터 다루기 - GSon 사용법 2017.03.15 8805 0
407 Python json 데이터 핸들링 2017.03.09 9047 0
406 Pi 라즈베리파이 gpio utility 2017.02.15 6548 0
405 C++ STL queue 사용법 2017.02.14 28854 0
404 C++ C++ string 정리 (C++ 문자열) 2017.02.14 13424 0
403 Pi 라즈베리파이 3, Spec & PIN Map file 2017.02.06 30916 0
402 일반 Anet A8 Prusa i3: tips and tricks 2017.02.04 22974 0
목록
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 11 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5