2016-09-30 3 views

答えて

0

のsprintfの代わりにファイルに書き込む(S、...)の使用のfprintf(F、...)

#include <memory.h> 
#include <string.h> 
#include <stdlib.h> 
#include <assert.h> 

//replace string a with string b in str 
//str must have enough space 
char* _replace(char* str, char* a, char* b, int len, int lena, int lenb) 
{ 
    for (char* p = str; p = strstr(p, a);) 
    { 
     if (lena != lenb) // shift end as needed 
      memmove(p + lenb, p + lena, len + 1 - (p + lena - str) + 1); 
     memcpy(p, b, lenb); 
     p += lenb; 
    } 
    return str; 
} 

//allocate space which must be free'd 
//wrap in " and replace " by "" if necessary 
char* _csv_alloc(char* str) 
{ 
    int len = strlen(str); 
    char *_str = (char*)malloc(2 * len + 1 + 2); 
    bool wrap = false; 
    if (strchr(str, ';') != NULL || strchr(str, '\"') != NULL) 
     wrap = true; 
    if (wrap) 
    { 
     _str[0] = '\"'; 
     memcpy(_str + 1, str, len + 1); 
    } 
    else 
     memcpy(_str, str, len + 1); 
    _replace(wrap ? (_str + 1) : _str, "\"", "\"\"", len, 1, 2); 

    if (wrap) 
    { 
     len = strlen(_str); 
     _str[len] = '\"'; 
     _str[len + 1] = '\0'; 
    } 
    return _str; 
} 



int main() 
{ 
    char *c1 = "Nothing to escape"; 
    char *c2 = "Here the ; entails wrapping"; 
    char *c3 = "Here the \" entails wrapping and escaping"; 
    char *_c1 = _csv_alloc(c1); 
    char *_c2 = _csv_alloc(c2); 
    char *_c3 = _csv_alloc(c3); 
    char res[0xFF] = ""; 
    sprintf(res, "%s;%s;%s\n", _c1, _c2, _c3); 
    free(_c1); 
    free(_c2); 
    free(_c3); 
    assert(strcmp(res, "Nothing to escape;\"Here the ; entails wrapping\";\"Here the \"\" entails wrapping and escaping\"\n") ==0); 

    return 0; 
}