설명

숫자 문자열을 long형 숫자로 변환합니다. atoi()나 atol()과는 달리 (1) 변환하려는 진수를 선택할 수 있으며, (2) 숫자 문자가 아닌 문자를 만나면 그 포인터 위치를 구해 줍니다.

예로, "2007forum.falinux.com" 을 호출하게 되면,

   char   *str;
   char   *ptr;
   long    value;

   str   = "2007forum.falinux.com";
   value = strtol( str, &ptr, 10);
  • value에는 2007이 들어 가고
  • ptr에는 숫자로 변화하지 못하는 문자열의 시작 위치를 구해 줍니다.
    만약 NULL을 넘겨주면 시작 위치를 구하지 않습니다.

헤더 stdlib.h
형태 long strtol(const char *restrict str, char **endptr, int base);
인수
char *str 정수로 변환할 문자열
char **endptr 숫자로 변경하지 못하는 문자열의 시작 위치
int base 문자열이 가지고 있는 숫자의 진수 (2~32)
반환
long 10진 long형 정수 값

예제

#include <stdio.h>
#include <stdlib.h>

int main( void)
{
   char   *str;
   char   *ptr;
   long    value;

   str   = "2007forum.falinux.com";
   value = strtol( str, &ptr, 10);          // 10진수로 변환
   printf( "%s strtol =%ld    str=%s\n", str, value, ptr);

   value = strtol( str, &ptr, 8);           // 8진수로 변환
   printf( "%s strtol =%ld    str=%s\n", str, value, ptr);

   value = strtol( str, &ptr, 16);          // 16진수로 변환
                                            // 2007f까지 숫자로 변환이 됩니다.
   printf( "%s strtol =%ld    str=%s\n", str, value, ptr);

   return 0;
}
]$ ./a.out
2007forum.falinux.com strtol =2007    str=forum.falinux.com
2007forum.falinux.com strtol =1031    str=forum.falinux.com
2007forum.falinux.com strtol =131199    str=orum.falinux.com

 

출 처 : http://forum.falinux.com/zbxe/index.php?document_srl=408138&mid=C_LIB

'Programming > C' 카테고리의 다른 글

strtol() 정수 문자열을 진수 선택하여 정수로 변환  (0) 2014.03.17
sscanf  (0) 2014.02.10
strerror() 함수  (0) 2013.12.04
c99 표준 tagged structure initialization  (0) 2011.06.16
win32 DLL에서 CString 사용하기!  (0) 2009.05.11

댓글을 달아 주세요

sscanf

Posted by 춘자 Programming/C : 2014.02.10 23:37

특정 문자열에서 원하는 값을 원하는 data type으로 뽑아낼 수 있는

좋은 함수로 보인다.

참고 : http://itguru.tistory.com/67

'Programming > C' 카테고리의 다른 글

strtol() 정수 문자열을 진수 선택하여 정수로 변환  (0) 2014.03.17
sscanf  (0) 2014.02.10
strerror() 함수  (0) 2013.12.04
c99 표준 tagged structure initialization  (0) 2011.06.16
win32 DLL에서 CString 사용하기!  (0) 2009.05.11

댓글을 달아 주세요

strerror() 함수

Posted by 춘자 Programming/C : 2013.12.04 22:12

/* 
존재하지 않는 파일 unexist.ent 를 열라고 해 오류가 발생한다.
 */


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

int main ()
{
    FILE * pFile;
    pFile = fopen ("unexist.ent","r");
    if (pFile == NULL)
        printf ("Error opening file unexist.ent: %s\n",strerror(errno));
    return 0;
}


해당 에러가 발생한 원인에 대한 문자열을 출력해 준다.

'Programming > C' 카테고리의 다른 글

strtol() 정수 문자열을 진수 선택하여 정수로 변환  (0) 2014.03.17
sscanf  (0) 2014.02.10
strerror() 함수  (0) 2013.12.04
c99 표준 tagged structure initialization  (0) 2011.06.16
win32 DLL에서 CString 사용하기!  (0) 2009.05.11

댓글을 달아 주세요

c99 표준 tagged structure initialization

Posted by 춘자 Programming/C : 2011.06.16 20:07

There is one more way by which we can initialize structures. These way utilizes the benefits of both the ways of structure initialization described here. That is we are able to initialize the elements of the structure using the set notation and also we need not remember the order of the elements of the structure.
Suppose consider the structure ‘student‘ we already used

struct student {

     int roll;

     int class;

     char name[50];

};

Now let’s declare a variable st3 and initialize using the third method

student st3={

           .name = "Mark", //Notice the equal to and the comma

           .class  = 10,

           .roll  = 1038

};

As you can see the way by which the variable st3 has been initialized. It has used the set notation and also see the order is not the same as in the case of the structure ‘student


The following program demonstrates this. Note the different ways by which the array of structures has been initialized

/*

*Different Ways of structure initialization

*/#include < stdio.h>

#include < string.h>

#define NAME_LEN 25

typedef unsigned short age_t;

typedef unsigned int roll_t;

typedef struct student{

    char name[NAME_LEN];

    roll_t rno;

    age_t age;

}student;

int main()

{

/* Method 3a: Just like the Method 2a, but here you do not

* need to know order of the elements in the declaration

*/

student st3={

.name = "Mark",//Notice the equal to and comma

.age  = 23,
.rno  = 1038
};

printf("%s %hi %u\n\n",st3.name,st3.age,st3.rno);

/*

* Method 3b: For Initializing an array of structures

*/

student st4[]={
{

.name = "Neil",

.age  = 23,

.rno  = 1039      },

{

.name = "Peter",

.age  = 23,

.rno  = 1040

}
};

printf("%s %hi %u\n%s %hi %u\n\n",st4[0].name,st4[0].age,

st4[0].rno, st4[1].name,st4[1].age,st4[1].rno);

/*

* Method 3c : Change the order of initialization of the

* elements of the array. Normally as seen in Method 2b,

* the 0th array element is initialized  then 1st, then

* 2nd and so on. So by using a variation  of Method 3b,

* we  can initialize the array elements in any order

*/

student st5[5]={

  [3]={

              .name = "Titus",

              .age  = 22,

              .rno  = 1041      },

[2]={

              .name = "Stephen",

              .age  = 23,

              .rno  = 1042

      }

      /*As you can see only 2nd and 3rd array elements has

       * been initialized and that too not in order. Such

       * an initialization is useful, if we wish to allocate

       * some fixed size array but only initialize some element

       */
};

printf("%s %hi %u\n%s %hi %u\n\n",st5[2].name,st5[2].age,

st5[2].rno, st5[3].name,st5[3].age,st5[3].rno);

}
The Methods 3a, 3b and 3c are the ways of structure initialization that I have seen in the kernel code. If you find any other way to do the structure initialization, kindly comment.

'Programming > C' 카테고리의 다른 글

strtol() 정수 문자열을 진수 선택하여 정수로 변환  (0) 2014.03.17
sscanf  (0) 2014.02.10
strerror() 함수  (0) 2013.12.04
c99 표준 tagged structure initialization  (0) 2011.06.16
win32 DLL에서 CString 사용하기!  (0) 2009.05.11

댓글을 달아 주세요

class A 가 a.h에 있고

class B 가 b.h 에 있는데

B가 A를 사용하고 A가 B를 사용할 경우 :

거의 설계가 잘 못되었다고 볼 수 있다.

이렇게 프로그램을 짜면 이해하기가 힘들고 추적이 힘들기 때문에 경험많은

프로그래머들은 이렇게 짜지를 않는다.

 

흔히 전방선언이라고 하는 것은

 

class A;

class B

{

...

    A *pA;

};

 

와 같이 포인터만 이용할 때 가능합니다. class A의 포인터라면 그냥 4바이트(32bit OS)만

할당해 놓을 수 있지만 이것을

 

class A;

class B

{

...

   A a;

};

 

와 같이 하면 몇 byte를 할당해야 할지 알 수가 없으므로 에러를 냅니다.

이럴 경우에는 할 수 없이

 

#include "a.h"

class B

{

...

    A a;

};

 

이렇게 해야하는데

A a;

를 확인하려고 a.h 를 살펴보니

 

#include "b.h"

class A

{

...

   B b;

};

 

이렇게 (헤더 꼬임 현상)이 발생해서 무한 루프에 빠지게 됩니다.

(당연히 최상단에 올린 해더는 아래 해더를 모르므로 컴파일러는 알아서 에러를 내줍니다.)

이를 해결 하는 방법은 포함순서를 잘 맞추든지 아니면...

설계를 약간 바꾸는 것(전방 선언후 객체의 포인터 사용)이 좋지 않을까 합니다.

 

//////////////

 

class A / class B 가 있다. 그리고 A 는  B 를 사용할 것이다.

그럼 우리는 무엇을 해주어야 하는가?

 물론 A 쪽에 #include "B.h" 를 해주어야 할 것이다. 그래야 A 에서 B를 사용할 수 있으니까....

 

그런데.......

#include 의 수가 많아질수록 컴파일 속도가 저하된다는 것도 아시는지.....

이유는 생각해보면 알수 있다. 위에서 처럼 A 에 B 를 include 한다고 할때 만약 B.h 가 수정되면 include 부분도 이 영향을 받게 되며 수정이 많아질수록 컴파일 속도도 느려지게 된다.

 

이것을 해결하는 방법은? 전방선언을 사용하는 것이다.

(전방선언의 좋은점은 참조하려는 해더파일에 변경이 생겨도 참조 하는 해더파일에서는

재컴파일이 이루어 지지 않는다는 점이다.)

 

전방선언이란 가령 Player 라는 클래스가 선언된 헤더파일이 있을 경우

#include "Player.h" 대신

class Player;

이렇게 선언하는 것이다.

 

단, 주의해야 할 점이 있다. 전방선언자를 사용할 경우에는 그 클래스 관련 객체는 포인터형으로 선언해야 한다는 것이다. 만약 포인터형이 아닌 객체를 생성할 경우 전방선언자의 특징상 그 객체의 크기를 정확히 파악하여 할당을 못해주기 때문이다. (해당 클래스가 있다는 정보만 알고 사이즈를 모른다)

 

컴파일 적인 면에서 우리는 전방선언이 인클루드보다 속도, 의존관계 면에서 더 좋다고 하였다.

여기에 하나 더 추가하자면 다음과 같은 경우 우리는 전방선언을 유용하게 써먹을 수 있다.

 

class A, B 가 있다.

B는 A를 사용하고 있다 ( A 헤더를 인클루드하여 사용.... 상속은 아니다 )

그런데 우리는 부득이하게 A에서 B의 정보를 알아야 하는 상황에 놓이게 된다면....?

 

A는 B의 데이터를 알기위해선 B 의 구조를 알아야 하고 즉 B 헤더를 인클루드 해야 된다.

하지만 B에서 이미 A 헤더를 인클루드 하고 있기에 A 에서 B 헤더를 인클루드하면 상호 참조 에러가 되어버리고 만다. 즉 구조를 바꾸지 않는한 A 는 B 헤더를 인클루드 할수 없다는 것이다.

 

만약에 인클루드 대신에 앞에글에서 처럼 전방선언자를 사용한다면...?

 

#include "A.h"                                class B;

 

class B                                         class A

{                                                  {

   ///....                                           ///....

}                                                   }

 

이렇게 하면 우선 에러는 나지 않는다. ( 상호참조의 초석을 놓았다 )

다만 전방선언자를 사용하는 class A 에서는 B 를 포인터형으로 선언 또는 받는 처리만 가능할뿐

이를 동적 생성하거나 함수를 호출하면 에러가 나게 된다. 왜냐하면 전방선언자는 단순히 선언이기 때문에 생성, 호출은 실제 데이터 구조를 모르는 상태이므로 에러가 나게 되는 것이다.

그럼 동적 생성이나 호출을 하고 싶으면 어떻게 해야 하는가?

A.cpp 에서 구현을 하면 된다. 그리고 cpp 에 B.h 를 인클루드 하면 비로소 상호 참조가 가능하게 된다.

'Programming > C++' 카테고리의 다른 글

클래스 전방 선언(Forward declarations)와 상호 참조 헤더 파일  (1) 2010.12.19
inline 함수  (0) 2009.05.04
C++ XML Programming  (0) 2009.05.04

댓글을 달아 주세요

  1. 2012.01.11 10:10 신고 jjangmin  댓글주소  수정/삭제  댓글쓰기

    유용한 정보에 감사드립니다 ^^

윈폼에서 KeyDown 이벤트를 추가시켜주고 아래와 같은 소스를 입력하면

  private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1)
            {
                MessageBox.Show("HI");
               

            }
        }


F1 키를 눌렀을 경우 HI 라는 문자열이 출력되는 메세지 창이 뜬다.
F1 부분만 자신이 원하는 key를 써주면 된다.
ex ) Keys.M , Keys.Enter 등등...

☆ 주의 사항 ☆

폼에 버튼 등의 컨트롤을 추가하고 나서 프로그램을 실행시켜보면 key를 눌러도 우리가 원했던 HI 라는 메세지 창이 실행되지 않는다.
다른 컨트롤을 추가해도 마찬가지다.
이때 폼의 속성중에 KeyPreview = true 로 설정해주면 정상적으로 실행된다.

'Programming > C#' 카테고리의 다른 글

입력받은 키보드 key 를 이용하는 방법  (0) 2010.04.20
가상키 이벤트 보내기  (0) 2010.04.20
멀티 쓰레드 프로그램 종료시 프로세스가 종료되지 않는 현상  (0) 2009.09.23
byte배열 string으로 변환  (0) 2009.09.22
XML  (0) 2009.09.20
DATETIME 활용법  (2) 2009.05.04

댓글을 달아 주세요

가상키 이벤트 보내기

Posted by 춘자 Programming/C# : 2010.04.20 01:55

SendKeys.Send() 함수 
 
SendKeys.Send() 함수를 이용하면 사용자가 키를 누르지 않았어도 마치 키 입력이 들어온것 처럼 할수가 있습니다. 예를 들어 

SendKeys.Send("{ENTER}");  //엔터키를 눌렀다. 

이런식으로 보낼수가 있습니다. 자주 쓰는 Ctrl+C, Ctrl+V 같은 경우에는 이렇게 표현할수 있겠죠.

SendKeys.Send("^c"); // Ctrl+c 키를 눌렀다. 
SendKeys.Send("^v"); // Ctrl+v 키를 눌렀다. 


일반 알파벳 키와 합쳐서 쓰기 위해서는 

Ctrl = ^
Shift = +
Alt = %

이런식으로 " " 알파벳키 앞에 붙여줘야 합니다. 


특수키는 어떻게?
그렇다면 특수키를 어떻게 쓸까요? (눈치 빠른 분들은 벌써 눈치 채신듯^^;;)

특수키의 경우네는 " "  문자열안에 { } 중괄호를 넣은 그 안에 특수키 이름을 넣어 줍니다. 예를들면

SendKeys.Send("{ENTER}");
SendKeys.Send("{HELP}");  
SendKeys.Send("{ESC}"); 
SendKeys.Send("{F1}");  


이런식으로 넣어주면 됩니다. 
프로그램 종료를 의미하는 Alt + F4 를 이벤트로 보내고 싶다면

SendKeys.Send("%{F4}"); 

이렇게 해 주시면 됩니다.

참고 URL : http://msdn.microsoft.com/ko-kr/library/system.windows.forms.sendkeys.aspx

출처 : 티스토리 (
http://ash84.tistory.com/entry/C-%B0%A1%BB%F3-%C5%B0Key-%C0%CC%BA%A5%C6%AE-%BA%B8%B3%BB%B1%E2 )

'Programming > C#' 카테고리의 다른 글

입력받은 키보드 key 를 이용하는 방법  (0) 2010.04.20
가상키 이벤트 보내기  (0) 2010.04.20
멀티 쓰레드 프로그램 종료시 프로세스가 종료되지 않는 현상  (0) 2009.09.23
byte배열 string으로 변환  (0) 2009.09.22
XML  (0) 2009.09.20
DATETIME 활용법  (2) 2009.05.04

댓글을 달아 주세요

일반적으로 네트워크 프로그래밍을 하다보면 멀티 쓰레드 기반의 프로그래밍을 하게된다
여기서 발생하는 문제점은 프로그램을 종료하여도 해당 프로그램( 프로세스 ) 이 종료가 되지 않는 현상이다.

ctrl+alt+del 을 눌러보면 프로세스가 죽지 않은 것을 알 수 가 있다.

쓰레드는 전경 쓰레드와 배경 쓰레드가 있다.
자세한 건 생략하겠다. ( 나도 잘 모르기 때문에...-_- )

Thread의 property( 속성 ) 에는 IsBackground 가 있다.
이 속성을 true로 해주면 된다. 그럼 배경 쓰레드가 된다.
이렇게 해주면 프로세스가 정상적으로 종료하게 된다.


ex) 
Thread test = new Thread();
test.IsBackground = true;

'Programming > C#' 카테고리의 다른 글

입력받은 키보드 key 를 이용하는 방법  (0) 2010.04.20
가상키 이벤트 보내기  (0) 2010.04.20
멀티 쓰레드 프로그램 종료시 프로세스가 종료되지 않는 현상  (0) 2009.09.23
byte배열 string으로 변환  (0) 2009.09.22
XML  (0) 2009.09.20
DATETIME 활용법  (2) 2009.05.04

댓글을 달아 주세요

byte배열 string으로 변환

Posted by 춘자 Programming/C# : 2009.09.22 01:34
using System.Collections.Generic;
using System.Text;
namespace CS_1
{
    class Program
    {
        static void Main(string[] args)                                                                                    
        {
            byte[] byteArr = new byte[5];
            byteArr[0] = 70;
            byteArr[1] = 71;
            byteArr[2] = 69;
            byteArr[3] = 82;
            byteArr[4] = 33;
           
   Encoding en = Encoding.ASCII;  // or ( Encoding.UNICODE )
            string str = en.GetString(byteArr);        
            Console.WriteLine(str);
        }
    }

'Programming > C#' 카테고리의 다른 글

입력받은 키보드 key 를 이용하는 방법  (0) 2010.04.20
가상키 이벤트 보내기  (0) 2010.04.20
멀티 쓰레드 프로그램 종료시 프로세스가 종료되지 않는 현상  (0) 2009.09.23
byte배열 string으로 변환  (0) 2009.09.22
XML  (0) 2009.09.20
DATETIME 활용법  (2) 2009.05.04

댓글을 달아 주세요

XML

Posted by 춘자 Programming/C# : 2009.09.20 15:57
윈도우 어플리케이션을 개발하다 보면  XML 파일을 로드해서 특정 Element의 값을 얻고자 하는 경우가 많다.
이럴 때 간단히 쓸 수 있는 소스이다.
XML에 대한 자세한 사항은 따로 공부해야 될거 같다.

using System.Xml  추가

XmlTextReader reader = new XmlTextReader("http://www.abc.co.kr/test.xml");
   while (reader.Read())
   {
    if (reader.NodeType == XmlNodeType.Element && reader.Name == "title")
     Console.WriteLine(reader.ReadElementString());
   }
   reader.Close();


예를 들어서 title 이라는 Element 의 값을 얻고자 한다면 title를 넣어주면 된다. 
정말로 xml에 대해서 아무것도 모르는 사람이 급하게 써먹어야 될때 좋을 거 같다.

'Programming > C#' 카테고리의 다른 글

입력받은 키보드 key 를 이용하는 방법  (0) 2010.04.20
가상키 이벤트 보내기  (0) 2010.04.20
멀티 쓰레드 프로그램 종료시 프로세스가 종료되지 않는 현상  (0) 2009.09.23
byte배열 string으로 변환  (0) 2009.09.22
XML  (0) 2009.09.20
DATETIME 활용법  (2) 2009.05.04
태그 : C# xml

댓글을 달아 주세요

 «이전 1 2  다음»