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
'programing' 카테고리의 다른 글
| 여러 조건을 가진 XPath (0) | 2023.10.01 |
|---|---|
| "true" 및 "false" 문자열을 부울에 입력합니다. (0) | 2023.10.01 |
| 레벤쉬테인:MySQL + PHP (0) | 2023.10.01 |
| MySQL 스키마를 데이터와 함께 내보내는 방법은? (0) | 2023.10.01 |
| php umask(0) 목적이 무엇입니까? (0) | 2023.10.01 |