programing

c에서 여러 문자열을 연결하는 더 나은 방법?

easyjava 2023. 10. 1. 23:05
반응형

c에서 여러 문자열을 연결하는 더 나은 방법?

아래와 같이 strcat()에 여러 개의 호출을 모두 연속으로 수행하는 것보다 여러 개의 문자열을 연결하는 더 나은 방법이 있습니까?

char prefix[100] = "";
strcat(prefix, argv[0]);
strcat(prefix, ": ");
strcat(prefix, cmd_argv[0]);
strcat(prefix, ": ");
strcat(prefix, cmd_argv[1]);
perror(prefix);
sprintf(prefix,"%s: %s: %s",argv[0],cmd_argv[0],cmd_argv[1]);

아니면snprintf버퍼 오버런을 방지합니다.

snprintf가 가장 좋고 사용하기 쉬운 옵션이지만 "빠르지" 않을 수도 있습니다.당신의 기준이 무엇인지 말을 하지 않았습니다.단순성은 물론 다음과 같습니다.

snprintf(prefix, sizeof(prefix), "%s: %s: %s", argv[0], cmd_argv[0], cmd_argv[1]);

사용할 것입니다.sprintf()다른 사람들이 제안한 것처럼, 그러나 이것은 완전성을 위한 것입니다.

그렇다면 다음을 수행할 수 있습니다.

char prefix[100] = "";
stpcpy(stpcpy(stpcpy(sptcpy(stpcpy(prefix, argv[0]), ": "),
        cmd_argv[0]), ": "), cmd_argv[1]);
perror(prefix);

함의 함.stpcpy()위와 같이 "연쇄"될 수 있다는 것입니다.부터.stpcpy()합니다)에 를 반환합니다.stpcpy()통화는 이전 데이터를 몇 번이고 반복할 필요가 없습니다.strcat() 입니다보다 더일 것입니다.sprintf().stpcpy()POSIX: 2008 입니다.

나는 이것에 대해 다시 한 번 칭찬할지도 모르지만, 대체 뭐.일어날 수 있는 최악의 일은 내가 무언가를 배울 것이라는 것입니다.

요즘은 C를 잘 사용하지 않고, C++에서는 C 스타일의 문자열을 잘 사용하지 않습니다.그러나 한 가지 아이디어는 문자열의 끝을 반환하는 수정된 strcpy()를 작성하는 것입니다.

char* my_strcpy(char*dest, const char* src)
{
    while ((*dest = *src++))
        ++dest;
    return dest;
}

이제 쉴레미엘은 양동이를 가지고 올 수 있습니다.

char prefix[100] = "";
char* bucket = my_strcpy(prefix, argv[0]);
bucket = my_strcpy(bucket, ": ");
bucket = my_strcpy(bucket, cmd_argv[0]);
bucket = my_strcpy(bucket, ": ");
bucket = my_strcpy(bucket, cmd_argv[1]);
perror(prefix);

테스트 안 해봤어요.댓글?

한 했습니다를 했습니다.my_strcat()기능.또한 그것은 다음과 같은 것으로 밝혀졌습니다.stpcpy(), 2008년 현재 POSIX의 일부인 것으로 보입니다.http://www.manpagez.com/man/3/stpcpy/ 를 참조하십시오.

예에서 제안하는 다른 문자열로 문자열을 작성하려는 경우 snprintf를 사용할 수 있습니다.

char prefix[100] = "";
snprintf( prefix, sizeof(prefix), "%s: %s: %s", argv[0], cmd_argv[0], cmd_argv[1]);

형식 접근 방식을 사용할 수 없는 기존 문자열의 연결을 시도하는 경우 strcat에 대한 여러 호출이 중단될 수 있습니다. 대신 사용하고 버퍼 오버런이 없는지 확인하는 것을 고려할 것을 강력히 제안합니다.

게시된 대로 char*가 아닌 char[fixed_size]가 있다고 가정하면, 분리된 printf 스타일 형식이 아닌 cout 같은 주문으로 한 번에 할 수 있는 크리에이티브 매크로를 사용할 수 있습니다. 이 다와 기능 할 수 .snprintf()(이것은 다이어트에도 불평을 하지 않게 해줍니다) 그리고 필요하지도 않습니다.malloc()또는 의 어떤 기능.<string.h>.

#include <unistd.h> //for write
//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<(int)sizeof(buf))) \
            *bp++=*s++; \
    if (offset!=sizeof(buf))*bp=0; \
}while(0)

char buf[100];
int len=0;
strcpyALL(buf,len, argv[0],": ", cmd_argv[0],": ",cmd_argv[1]);
if (len==sizeof(buf))write(2,"error\n",6);
else write(1,buf,len); 
  • 참고 1, 정수를 문자열 유형으로 변환하는 itoa()와 같은 비표준 함수를 포함하여 char*를 출력하는 모든 함수를 사용할 수 있습니다.
  • 참고 2, 공유 라이브러리를 사용하고 있거나 정적으로 구축된 프로그램의 어느 곳에서나 이미 printf 스타일 함수를 사용하고 있다면 snprintf()를 사용하지 않는 유일한 이유는 (이 메서드에서는 컴파일된 코드가 더 크기 때문에) 인라인으로 처리되고 외부 함수를 호출하지 않으므로 상대적으로 빨라야 하기 때문일 것입니다.

snprintf 기능을 사용할 수 있습니다.

char prefix[100];
snprintf(prefix, 100, "%s: %s: %s", argv[0], cmd_argv[0], cmd_argv[1]);

매크로를 사용할 수는 없나요?

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

#define a argv[0]
#define b argv[1]
#define c argv[2]
#define strcat1(a,b,c) strcat(prefix, a);\
                       strcat(prefix, ": ");\
                       strcat(prefix, b);\
                       strcat(prefix, ": ");\
                       strcat(prefix, c);\
                       perror(prefix);\



int main(int argc, char *argv[]){
    char prefix[100] = "";
    strcat1(a,b,c);
    return 0;
}

언급URL : https://stackoverflow.com/questions/5889880/better-way-to-concatenate-multiple-strings-in-c

반응형