strcat 질문요

ch0nn0m의 이미지

strcat를 이용하여서 buf에 있는 배열을 buf2에 추가하려고 합니다.
세그멘테이션 오류가 나네요.
strcat를 사용해서 문자 하나씩 buf2에 넣어보고 싶은데...왜 그런가요??


int main()
{
        char buf[8]={'a','b','c','d','e','f','g'};
        char buf2[8];
        int i;
 
        for(i=0; buf[i]!='\0'; i++)
        {
                strcat(&buf2[i],&buf[i]);
 
                printf("buf2 안에는 %s\n",buf2);
         }
}

jhakan의 이미지

첫번째, buf2 배열 초기화를 안하셨어요.
두번째, strcat 함수의 의미를 잘못 알고 계신거 같은데.. strcat(A, B) 는 문자열A와 문자열B를 연결해서 문자열A에 집어넣는 함수입니다. 위의 for문이 성공하려면 buf2는 최소 29(?)개의 배열 크기를 가지고 있어야 합니다.

ttti07의 이미지

C++에는 아예 string이란 data type이 있지만, C에선 character type array를 string이라고 부르곤 합니다.
이때, character type array에 원하는 character들을 넣고, 마지막으로 NULL 까지 넣어줘야 string이라고 부릅니다.
NULL은 꼭 array의 마지막에 올 필요가 없습니다.
모든 string 처리 함수는 array에서 NULL을 발견하면 뒤의 것들은 모두 무시합니다.

/* C String */
char buf[8]={'a','b','c','d','e','f','g', '\0'};

strcat은 바로 이 string을 복사해서 뒤에 덧붙여주는 함수입니다.
그러니 문자 하나씩 buf2에 넣고 싶다면 strcat을 쓸 수 없습니다.

for(i=0; buf[i]!='\0'; i++) {
    buf2[i] = buf[i];
}
printf("buf2 안에는 %s\n",buf2);

strcat을 굳이 쓰신다면 buf2도 string으로 만들어야 하며, for은 쓸 필요가 없습니다.

buf2[0] = '\0';    // 첫 character가 0인 경우 비어있는 string이 된다. 뒤의 값들은 뭐가 들어있든 상관이 없다.
strcat(buf2, buf);
printf("buf2 안에는 %s\n",buf2);
kkn1380의 이미지

strcat함수의 경우 기존에 있는 string에 이어서 붙이는 겁니다.
예를 들어서
char a[5] = {'a', 'b', 'c', 'd'};
char b[5] = {'z',};
strcat(b, a);
라고 할 경우 b에 있는 데이터는 zabcd라고 되는 겁니다.
일반적으로 C에서는 NULL값을 이용해서 string의 마지막을 나타내도록 되어 있으며 위의 코드의 경우 buf2의 크기를 충분히 할당할 경우
buf2 안에는 abcdefg
buf2 안에는 abcdefgbcdefg
buf2 안에는 abcdefgbcdefgcdefg
buf2 안에는 abcdefgbcdefgcdefgdefg
buf2 안에는 abcdefgbcdefgcdefgdefgefg
buf2 안에는 abcdefgbcdefgcdefgdefgefgfg
buf2 안에는 abcdefgbcdefgcdefgdefgefgfgg
와 같은 결과가 나타나게 될건데요
위의 코드에 대해 위와 같은 결과가 나오는 것을 조금 더 자세히 설명 하자면
buf2가 초기화 되어있고 충분한 메모리를 할당 받았을 경우 loop문 내에서
i가 0인 경우 : strcat(&buf2[0],&buf[0]); -> buf2의 값은 abcdefg
i가 1인 경우 : strcat(&buf2[1],&buf[1]); -> buf2의 값은 abcdefg + bcdefg
i가 2인 경우 : strcat(&buf2[2],&buf[2]); -> buf2의 값은 abcdefg + bcdefg + cdefg
와 같이 동작하는 겁니다
일단 위에서 문의 하신 코드에서 값이 들어가야 할 buf2의 경우 buf와 같은 크기로 잡혀있기 세그멘테이션 오류가 발생하는 겁니다.
그리고 buf2에 대해서 초기화도 하시지 않았고요. strcat은 output의 NULL을 찾아서 그부분부터 input값을 넣어주는 거니까 당연히 세그멘테이션 오류가 발생하는겁니다.
문의하신분은 먼저 C에서 string을 어떤방식으로 다루는지 부터 아셔야 할것 같네요. 그리고 함수의 정확한 사용법도..^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.