어떻게 sprintf을 사용하여 문자열을 추가할 수 있는?
나는 가지고 심각한 문제에 부딪혀 있습니다.sprintf
.
내 코드 한 토막은 합시다.
sprintf(Buffer,"Hello World");
sprintf(Buffer,"Good Morning");
sprintf(Buffer,"Good Afternoon");
.
.
.
일부 100전력 질주해서....
이거 전 좋아해,overwritten고 있다.
어떻게 이용을 덮어쓰를 피할 수 있다.sprintf
?언젠가 내가 만약을 주printf
종래에 나는 모든 선들이 보고 싶다.
너가 필요합니다.
sprintf(Buffer,"Hello World");
sprintf(Buffer + strlen(Buffer),"Good Morning");
sprintf(Buffer + strlen(Buffer),"Good Afternoon");
물론 당신이 충분히 클 버퍼가 필요하다.
int length = 0;
length += sprintf(Buffer+length, "Hello World");
length += sprintf(Buffer+length, "Good Morning");
length += sprintf(Buffer+length, "Good Afternoon");
여기 오류에 약간의 저항이 가능한 버전이다.때 오류, 당신을 그렇게 오래 할 수 있을 때 당신의 즐거운 길을 따라 계속할 수 있는지 신경 쓰지 않는다 그것은 유용하다.
int bytes_added( int result_of_sprintf )
{
return (result_of_sprintf > 0) ? result_of_sprintf : 0;
}
int length = 0;
length += bytes_added(sprintf(Buffer+length, "Hello World"));
length += bytes_added(sprintf(Buffer+length, "Good Morning"));
length += bytes_added(sprintf(Buffer+length, "Good Afternoon"));
의 반환 값을 사용한다.sprintf()
Buffer += sprintf(Buffer,"Hello World");
Buffer += sprintf(Buffer,"Good Morning");
Buffer += sprintf(Buffer,"Good Afternoon");
작은 전체 코드 예제에서는
단지 평평한 플레인stdio 표준 라이브러리 사용됩니다.
#include <stdio.h>
int main()
{
char c[1024];
int i=0;
i+=sprintf(c+i,"We " );
i+=sprintf(c+i,"Love " );
sprintf(c+i,"Coding");
printf("%s",c);
}
출력:우리는 코딩을 사랑합니다
안전을 위해(버퍼 오버플로) snprintf() 사용을 권장합니다.
MAX_B로 설정UF = 1000;char* 버퍼 = malloc(MAX_BUF); int 길이 = 0;길이 += snprintf(버퍼+길이, MAX_BUF-length, "Hello World"); 길이 += snprintf(버퍼+길이, MAX_BUF-length, "굿모닝"); 길이 += snprintf(버퍼+길이, MAX_BUF-length, "안녕하세요");
A snprintfcat()
을 위해 포장하다.snprintf()
:
size_t
snprintfcat(
char* buf,
size_t bufSize,
char const* fmt,
...)
{
size_t result;
va_list args;
size_t len = strnlen( buf, bufSize);
va_start( args, fmt);
result = vsnprintf( buf + len, bufSize - len, fmt, args);
va_end( args);
return result + len;
}
찾고 계신 것 같은데요?fmemopen(3)
:
#include <assert.h>
#include <stdio.h>
int main(void)
{
char buf[128] = { 0 };
FILE *fp = fmemopen(buf, sizeof(buf), "w");
assert(fp);
fprintf(fp, "Hello World!\n");
fprintf(fp, "%s also work, of course.\n", "Format specifiers");
fclose(fp);
puts(buf);
return 0;
}
동적 스토리지가 사용 사례에 더 적합하다면 Liam의 뛰어난 사용 방법을 따를 수 있습니다.open_memstream(3)
:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *buf;
size_t size;
FILE *fp = open_memstream(&buf, &size);
assert(fp);
fprintf(fp, "Hello World!\n");
fprintf(fp, "%s also work, of course.\n", "Format specifiers");
fclose(fp);
puts(buf);
free(buf);
return 0;
}
다음과 같은 방법이 효과적이라고 생각합니다.
sprintf(Buffer,"Hello World");
sprintf(&Buffer[strlen(Buffer)],"Good Morning");
sprintf(&Buffer[strlen(Buffer)],"Good Afternoon");
strcat http://www.cplusplus.com/reference/cstring/strcat/ 사용
int main ()
{
char str[80];
strcpy (str,"these ");
strcat (str,"strings ");
strcat (str,"are ");
strcat (str,"concatenated.");
puts (str);
return 0;
}
Output:
these strings are concatenated.
왜 사용하려고 합니까?sprintf
스트링 연결의 경우, 예를 들어 필요한 것을 위한 메서드가 있습니다.
그냥 현악기를 붙이는 거야?또는 다양한 데이터 유형(인트, 플로트 등)을 추가할 예정입니까?
이것을 자신의 기능으로 추상화하는 것이 더 쉬울 수 있다(다음은 C99를 가정한다).
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
int appendToStr(char *target, size_t targetSize, const char * restrict format, ...)
{
va_list args;
char temp[targetSize];
int result;
va_start(args, format);
result = vsnprintf(temp, targetSize, format, args);
if (result != EOF)
{
if (strlen(temp) + strlen(target) > targetSize)
{
fprintf(stderr, "appendToStr: target buffer not large enough to hold additional string");
return 0;
}
strcat(target, temp);
}
va_end(args);
return result;
}
이렇게 사용할 수 있습니다.
char target[100] = {0};
...
appendToStr(target, sizeof target, "%s %d %f\n", "This is a test", 42, 3.14159);
appendToStr(target, sizeof target, "blah blah blah");
기타.
함수는 다음 값을 반환합니다.vsprintf
이것은, 대부분의 실장에서는, 행선지에 기입된 바이트 수입니다.이 구현에는 몇 가지 구멍이 있지만, 몇 가지 아이디어를 얻을 수 있을 것입니다.
다음 간단한 행을 사용하여 하나의 버퍼에 문자열을 추가할 수 있습니다.
sprintf(Buffer,"%s %s %s","Hello World","Good Morning","Good Afternoon");
PHP str append: str . str . ... 등과 같은 함수 지원 동적 변수 문자열 append를 작성합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
int str_append(char **json, const char *format, ...)
{
char *str = NULL;
char *old_json = NULL, *new_json = NULL;
va_list arg_ptr;
va_start(arg_ptr, format);
vasprintf(&str, format, arg_ptr);
// save old json
asprintf(&old_json, "%s", (*json == NULL ? "" : *json));
// calloc new json memory
new_json = (char *)calloc(strlen(old_json) + strlen(str) + 1, sizeof(char));
strcat(new_json, old_json);
strcat(new_json, str);
if (*json) free(*json);
*json = new_json;
free(old_json);
free(str);
return 0;
}
int main(int argc, char *argv[])
{
char *json = NULL;
/*
str_append(&json, "name: %d, %d, %d", 1, 2, 3);
str_append(&json, "sex: %s", "male");
str_append(&json, "end");
str_append(&json, "");
str_append(&json, "{\"ret\":true}");
*/
int i;
for (i = 0; i < 100; i++) {
str_append(&json, "id-%d", i);
}
printf("%s\n", json);
if (json) free(json);
return 0;
}
char string1[] = "test";
char string2[] = "string";
int len = sizeof(string1) + sizeof(string2);
char totalString[len];
sprintf(totalString, "%s%s",string1,string2);
strcat 사용()buffer
,"Your new string...here
" )를 옵션으로 사용합니다.
그럼 어떻게 되는 거죠?
char s[100] = "";
sprintf(s, "%s%s", s, "s1");
sprintf(s, "%s%s", s, "s2");
sprintf(s, "%s%s", s, "s3");
printf("%s", s);
그러나 버퍼 오버플로우 가능성을 고려하십시오.
언급URL : https://stackoverflow.com/questions/2674312/how-to-append-strings-using-sprintf
'source' 카테고리의 다른 글
Linux에서 Java의 가상 메모리 사용량, 너무 많은 메모리가 사용됨 (0) | 2022.08.15 |
---|---|
char 배열에 저장된 머신 코드를 호출하려면 어떻게 해야 합니다. (0) | 2022.08.15 |
게터나 세터는 디자인이 좋지 않은가요?모순된 조언이 표시됨 (0) | 2022.08.15 |
v-for, 클릭된 목록 항목을 여는 방법 (0) | 2022.08.15 |
어떻게 전체 JAR 파일을 디컴파일 할 수 있죠? (0) | 2022.08.15 |