IT TIP

sprintf를 사용하여 문자열을 추가하는 방법은 무엇입니까?

itqueen 2020. 12. 27. 20:34
반응형

sprintf를 사용하여 문자열을 추가하는 방법은 무엇입니까?


sprintf에 심각한 문제가 있습니다.

내 코드 조각이 다음과 같다고 가정합니다.

sprintf(Buffer,"Hello World");
sprintf(Buffer,"Good Morning");
sprintf(Buffer,"Good Afternoon");
.
.
.

수백 개의 스프린트 ....

이렇게하면 덮어 쓰게됩니다.

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"));

안전을 위해 (버퍼 오버플로) snprintf ()를 사용하는 것이 좋습니다.

const int MAX_BUF = 1000;
char * 버퍼 = malloc (MAX_BUF);

int 길이 = 0;
length + = snprintf (Buffer + length, MAX_BUF-length, "Hello World");
length + = snprintf (Buffer + length, MAX_BUF-length, "Good Morning");
length + = snprintf (Buffer + length, MAX_BUF-length, "Good Afternoon");

에 대한 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;
}

반환 값 사용 sprintf()

Buffer += sprintf(Buffer,"Hello World");
Buffer += sprintf(Buffer,"Good Morning");
Buffer += sprintf(Buffer,"Good Afternoon");

왜 사용 하시겠습니까 sprintf방법은 특별히이 같은 필요에 대한이 구성 될 때 문자열 연결 strcatstrncat?


단순히 문자열 리터럴을 추가하고 있습니까? 아니면 다양한 데이터 유형 (정수, 부동 소수점 등)을 추가 할 예정입니까?

이를 자체 함수로 추상화하는 것이 더 쉬울 수 있습니다 (다음은 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대부분의 구현에서 대상에 기록 된 바이트 수인에서 값을 반환 합니다. 이 구현에는 몇 가지 구멍이 있지만 몇 가지 아이디어를 제공해야합니다.


나는 당신이 찾고 있다고 생각합니다 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");

아래 표시된 간단한 줄을 사용하여 하나의 버퍼에 문자열을 추가 할 수 있습니다.

sprintf(Buffer,"%s %s %s","Hello World","Good Morning","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. 

PHP str append : str과 같이 동적 변수 문자열 append를 지원하는 함수를 작성합니다. str. ... 등

#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;
}

작은 전체 코드 예제

평평한 일반 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);
    }

출력 : 코딩을 좋아합니다


옵션으로 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

반응형