문자열과 상수 C / ipv6-literal. 연결 어떻게 합니까?

39 m, C 에, 나는 몇 i& apc® 연결할 것.

지금 내가 다.

message = strcat("TEXT ", var);

message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));

39 m, C 에서 I& 합니다 이제 경험이 있다면 이 사실을 안 할 때 사용하면 세그먼트화 잘못이요 하기 때문이다. 해결할 수 있는 미확인범은 어떻게 합니까?

질문에 대한 의견 (2)
해결책

C 에서, &quot strings"; 단지 '일반' 챨 배열입니다. 따라서, t, 그들과 함께 직접 연결, 다른 &quot strings&quot # 39 can& 있습니다.

'기능을 사용할 수 있는 문자열 abc. 첨부됩니다 스트라카트' 에 의해 'src dest 구체화하십시오 abc. 끝까지' 에 '':

char *strcat(char *dest, const char *src);

이것은 ui_policytable_java_spe_policy 에서 (예: cplusplus.com:

char str[80];
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");

첫 번째 매개변수에서 제공해야 할 때 대상 버퍼 할 수 있다. 대상 버퍼 드라이브여야 합니다 챨 어레이입니다 것을 의미한다. E. g.: '챨 버퍼 [1024년];'

  • 어떤 you& 저장하였습니다 충분한 공간이 있는 첫 번째 매개변수에서 smartupdate * # 39, re 복사하고 다르거든요. 사용할 경우, 다음과 같은 기능을 사용할 수 있는 것이 안전합니다 'strcpy_s strcat_s 명시적으로 지정할 수 있다' 와 '대상' 어디에 크기를 의미한다.

Note: 있기 때문에 일정한 버퍼입니다 ipv6-literal. 문자열으로 로 사용할 수 없습니다. 항상 이런 식으로 할당하는 챨 어레이입니다 대한 것을 의미한다.

이 같은 되돌려줍니다 스트라카트 반환 값 ',' 가 될 뿐입니다 포인터를 단순히 무시됨 통과된 첫 번째 인수로 넘겨준다. 그리고 그 속에는 편리하게 이용할 수 있도록 하면 agent. 체인으로 있습니다 한 줄로 코드:

strcat(strcat(str, foo), bar);

문제를 해결할 수 있도록 다음과 같습니다.

char *foo = "foo";
char *bar = "bar";
char str[80];
strcpy(str, "TEXT ");
strcat(str, foo);
strcat(str, bar);
해설 (14)

사용하지 않는 ['스트라카트'] (http://en.cppreference.com/w/cpp/string/byte/strcat) 에서 C 코드. 무엇보다도 가장 안전한 방법으로 사용할 수 있는 깨끗한 ['스나이나프'] (http://en.cppreference.com/w/cpp/io/c/snprintf):

char buf[256];
snprintf(buf, sizeof buf, "%s%s%s%s", str1, str2, str3, str4);

일부 댓글 수가 인수 문제가 뚜르산을 형식 문자열 코드와 일치하지 않을 수 있습니다, 기울이나 컴파일러에도 경우 이미 이 문제를 계속 컴파일하십시오 경고에는 경우.

해설 (17)

여러분, 사용,,,, str&lt str&lt b&gt n&lt /b&gt 스피 (), 고양이 () 또는 s&lt /b&gt b&gt n<;;;; b&gt n&lt /b&gt printf (). 네, 쓰레기, 다른 어떤 공간이 메모리에서 inet6.0 &lt br&gt 충족시켰습니다 버퍼 된다! br&gt <; (및 # 39, & # 39 의 뒤에 nulll 너희에게베풀어진 공간을 확보하려면 \0&. 문자!)

해설 (9)

컴파일 타임에 문장열 연결된 수도 있습니다.

#define SCHEMA "test"
#define TABLE  "data"

const char *table = SCHEMA "." TABLE ; // note no + or . or anything
const char *qry =               // include comments in a string
    " SELECT * "                // get all fields
    " FROM " SCHEMA "." TABLE   /* the table */
    " WHERE x = 1 "             /* the filter */ 
                ;
해설 (0)

또한 경우에 유용합니다 malloc 및 대해 realloc 을 수행할 수 있을지 알 수 없다, 미리 don& # 39 시용되는 문장열 연결된 속속 등장하고 있다.

#include 
#include 

void example(const char *header, const char **words, size_t num_words)
{
    size_t message_len = strlen(header) + 1; /* + 1 for terminating NULL */
    char *message = (char*) malloc(message_len);
    strncat(message, header, message_len);

    for(int i = 0; i < num_words; ++i)
    {
       message_len += 1 + strlen(words[i]); /* 1 + for separator ';' */
       message = (char*) realloc(message, message_len);
       strncat(strncat(message, ";", message_len), words[i], message_len);
    }

    puts(message);

    free(message);
}
해설 (1)

출력 버퍼에 초기화하려면 것을 잊지 마십시오. 첫 번째 인수를 위한 추가 공간을 충분히 문자열을 입력해야 합니다 할당할지 스트라카트 종료된 결과 문자열.

char out[1024] = ""; // must be initialized
strcat( out, null_terminated_string ); 
// null_terminated_string has less than 1023 chars
해설 (0)

훨씬 개선된 문자열 처리 등 지적도 제기됐다. 수 있도록 확인하시겠습니까 c++컴파일러는 문자열 라이브러리 사용 방법 대신 c 스타일 써줬지 그러나 이 솔루션을 순결케 C

#include 
#include 
#include 

void appendToHello(const char *s) {
    const char *const hello = "hello ";

    const size_t sLength     = strlen(s);
    const size_t helloLength = strlen(hello);
    const size_t totalLength = sLength + helloLength;

    char *const strBuf = malloc(totalLength + 1);
    if (strBuf == NULL) {
        fprintf(stderr, "malloc failed\n");
        exit(EXIT_FAILURE);
    }

    strcpy(strBuf, hello);
    strcpy(strBuf + helloLength, s);

    puts(strBuf);

    free(strBuf);

}

int main (void) {
    appendToHello("blah blah");
    return 0;
}

나는 결코 올바른 / 안전 합니다 하지만 지금 내가 모두인지 이 ANSI c 더 나은 방법으로 찾을 수 없습니다.

해설 (11)

이를 위한 최선의 방법을 사용하여 않고도 라이전대프 () 는 제한된 버퍼 크기

char* concat(const char* str1, const char* str2)
{
    char* result;
    asprintf(&result, "%s%s", str1, str2);
    return result;
}
해설 (2)

어떤 것은 정의되지 않은 행동을 수정할 수 있으며, 이는 다음과 같은 항목을 리터럴 문자열

strcat ("Hello, ", name);

할 수 있는 '이름' 문자열이어야 택 시도하시겠습니까 시도할 계획이다. ',' 안녕, &quot 구체화하십시오 ipv6-literal. &quot, 끝까지 잘 정의된 않는.

뭔가 시도하시겠습니까 이. 이 너희는너희가 달성 할 것으로 나타날 수 있다.

char message[1000];
strcpy (message, "TEXT ");
strcat (message, var);

이로 인해 영역이 버퍼입니다 는 모두 수정 후 복제본에 ipv6-literal. 및 기타 텍스트 문자열을 수 있습니다. 그냥 버퍼 오버플로를 주의해야 합니다. 입력 데이터를 제어할 경우 벌금 (또는 미리 확인해), it& # 39 의 고정 길이 버퍼 마치 내가 사용할 수 있다.

그렇지 않으면 콩지름에 완화 같은 전략을 통해 충분한 메모리를 할당하는 힙 있는지 확인하는 돌봐줄꺼야. 즉, 다음과 같은 항목을

const static char TEXT[] = "TEXT ";

// Make *sure* you have enough space.

char *message = malloc (sizeof(TEXT) + strlen(var) + 1);
if (message == NULL)
     handleOutOfMemoryIntelligently();
strcpy (message, TEXT);
strcat (message, var);

// Need to free message at some point after you're done with it.
해설 (5)

가질 수 있어야 합니다 () 의 첫 번째 인수 스트라카트 위한 충분한 공간이 연결된 구체화하십시오. 그래서 할당할지 버퍼입니다 공간이 수신하십시오 결과.

char bigEnough[64] = "";

strcat(bigEnough, "TEXT");
strcat(bigEnough, foo);

/* and so on */

두 번째 인수를 저장하고 스트라카트 연결 () 는 첫 번째 인수, 이로 인해 이 첫 번째 인수, 단 첫 번째 인수, 이 반환되었습니다 챨 * 는 단순히 편의를 위해.

첫 번째와 두 번째 연결 문자열 인수를 통해 얻을 수 없는 경우 새로 할당된 I& 예상한 것 같아요; d # 39 를 따라 제거되었다.

해설 (0)

직접 작성할 수 있습니다 () '기능을 제공하는 것이 아니라, 같은 것입니다.' 로 스트라카트 높여줍니까 doesn& # 39, 아무것도 바꾸지 않는다.

#define MAX_STRING_LENGTH 1000
char *strcat_const(const char *str1,const char *str2){
    static char buffer[MAX_STRING_LENGTH];
    strncpy(buffer,str1,MAX_STRING_LENGTH);
    if(strlen(str1) < MAX_STRING_LENGTH){
        strncat(buffer,str2,MAX_STRING_LENGTH - strlen(buffer));
    }
    buffer[MAX_STRING_LENGTH - 1] = '\0';
    return buffer;
}

int main(int argc,char *argv[]){
    printf("%s",strcat_const("Hello ","world"));    //Prints "Hello world"
    return 0;
}

모두 함께 1000년 이상인 자, 그렇지 않을 경우 문장열 잘라냅니다 구체화하십시오 dell. 1000년 자입니다. 'MAX_STRING_LENGTH 요구에 맞게' 의 값을 변경할 수 있습니다.

해설 (16)

C 에서 경험이 있다면 문자열만 챨 스토리지와의 있는 것을 볼 수 있습니다 마지막 문자는 null 문자를.

이제 마지막 문자를 찾을 수 있을 때 매우 불편한 덮어쓰기/추가 위해 뭔가. '스트라카트' 그럴 당신꺼에요.

그래서 스트라카트 검색을 위한 첫 번째 인수를 통해 null 문자를. 이와 함께 두 번째 argument& 어졌다면 대체할 예정이라고 # 39 의 내용 (보살피되 끝나는 nulll).

지금 # 39 의 let& 검색하기를 통해 코드:

message = strcat("TEXT " + var);

여기있었구나 가리키는 포인터를 &quot TEXT&quot, 텍스트 추가 되는 게 아니다. (이 유형의 &quot TEXT"; const char * 있다. A 포인터입니다.).

일반적으로 가 작동하지 않는다. 또한, TEXT&quot &quot 수정. 어레이입니다 작동하지 않을 수 있기 때문에 보통 브렌티아아과 (일정한 분할됩니다.

message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));

더욱 효율적으로 사용할 수 있는 것을 제외하면 틀렸다니까 수정하려고 정적임 다시 등장한다. 그 결과 새로운 메모리 할당 스트라카트 아니다.

나라면 이렇게 뭔가를 제안하십시오 대신:

sprintf(message2, "TEXT %s TEXT %s", foo, bar);

'문서' 를 읽고 스프링스프 it& 확인할지 # 39 의 옵션.

그리고 지금 중요한 점은.

버퍼에 저장할 수 있도록 충분한 공간이 텍스트와 null 문자를. 몇 가지 기능을 하는 데 도움이 될 수 있는, 예를 들어, 스테른스트 및 특수 버전의 printf 할당할지 버퍼 당신꺼에요. 버그 악용 부패와 원격으로요 메모리 버퍼 크기를 이어질 수 없습니다.

해설 (1)
  • You have a 챨 [fixed_size] 챨 아닌 경우, 이를 위한 하나의 매크로를 사용할 수 있습니다,, 함께 한 번에요 &lt &lt cout&lt &lt 'like' 주문 (&quot, 대답하도다 %s 가 분리된 %s\n";;; than&quot &quot &quot printf 스타일입니까 format"). 또 임베디드 시스템, 이 방법을 사용하는 경우 malloc 및 대형 '의 printf 함수를 사용하면 leave out like' '제품군뿐입니다 스나이나프 ()' (이렇게 하면 dietlibc 에서 printf 너무 불만을 )

#include  //for the write example
//note: you should check if offset==sizeof(buf) after use
#define strcpyALL(buf, offset, ...) do{ \
    char *bp=(char*)(buf+offset); /*so we can add to the end of a string*/ \
    const char *s, \
    *a[] = { __VA_ARGS__,NULL}, \
    **ss=a; \
    while((s=*ss++)) \
         while((*s)&&(++offset
해설 (0)

즉 정적으로 틀렸다니까 복사하고 문자열으로 salesforce. 주소가 할당됩니다. Cat 로 버퍼입니다 합니다.

구체적으로 살펴보면 다음과 같습니다.

오스니퍼

대상

Pointer to the destination array, which should contain a C string, and be large enough to contain the concatenated resulting string.

오스니퍼

http://www.cplusplus.com/reference/clibrary/cstring/strcat.html

여기에도 there& # 39 의 예입니다.

해설 (0)
int main()
{
    char input[100];
    gets(input);

    char str[101];
    strcpy(str, " ");
    strcat(str, input);

    char *p = str;

    while(*p) {
       if(*p == ' ' && isalpha(*(p+1)) != 0)
           printf("%c",*(p+1));
       p++;
    }

    return 0;
}
해설 (0)

이는 내 솔루션이므로

#include 
#include 

char *strconcat(int num_args, ...) {
    int strsize = 0;
    va_list ap;
    va_start(ap, num_args);
    for (int i = 0; i < num_args; i++) 
        strsize += strlen(va_arg(ap, char*));

    char *res = malloc(strsize+1);
    strsize = 0;
    va_start(ap, num_args);
    for (int i = 0; i < num_args; i++) {
        char *s = va_arg(ap, char*);
        strcpy(res+strsize, s);
        strsize += strlen(s);
    }
    va_end(ap);
    res[strsize] = '\0';

    return res;
}

하지만 얼마나 많은 사람들이 가는 연결 문자열을 you& # 39 지정해야 합니다.

char *str = strconcat(3, "testing ", "this ", "thing");
해설 (0)

뭔가 시도하시겠습니까 비슷할 것입니다.

#include 
#include 

int main(int argc, const char * argv[])
{
  // Insert code here...
  char firstname[100], secondname[100];
  printf("Enter First Name: ");
  fgets(firstname, 100, stdin);
  printf("Enter Second Name: ");
  fgets(secondname,100,stdin);
  firstname[strlen(firstname)-1]= '\0';
  printf("fullname is %s %s", firstname, secondname);

  return 0;
}
해설 (0)