簡體   English   中英

C在while循環中連接字符串

[英]C Concatenate string in while loop

我正在嘗試使用十六進制值連接結構的一部分。 我遍歷循環中的每個字節並轉換為十六進制,然后我想將所有十六進制連接成一個長字符串。

但是,我在循環末尾只得到一個值。 由於某種原因,字符串無法正確連接。 知道我在做什么錯嗎?

typedef struct OPTIONS_STR
{
    int max;
    int printName;
} OPTIONS;

void set_default_options(OPTIONS *options)
{
    options->max = -1;
    options->printName = 0;
}

void do_file(FILE *in, FILE *out, OPTIONS *options)
{
    char ch;
    int loop = 0;
    char buf[81];
    buf[0] = '\0';
    int sz1;
    int sz2;
    int sz3;

    int seeker = offsetof(struct myStruct, contents.datas);

    //find total length of file
    fseek(in, 0L, SEEK_END);
    sz1 = ftell(in);

    //find length from beggining to struct beginning and minus that from total length
    fseek(in, seeker, SEEK_SET);
    sz2 = sz1 - ftell(in);

    //set seek location at beginning of struct offset
    fseek(in, seeker, SEEK_SET);

    sz3 = sz2 + 1;
    char buffer[sz3];
    char msg[sz3];

    buffer[0] = '\0';

    while (loop < sz2)
    {
        if (loop == sz2)
        {
            break;
        }

        fread(&ch, 1, 1, in);
        sprintf(msg, "%02X", (ch & 0x00FF));
        strcpy(buffer, msg);

        ++loop;
    }
    printf("%s\n", buffer);
}

int main(int argc, const char * argv[]) {

    OPTIONS options;
    set_default_options(&options);

    const char *current = "/myfile.txt";
    FILE *f = fopen(current, "rb");
    do_file(f, stdout, &options);
    fclose(f);

};

使用strcat而不是strcpy 那應該解決您的問題。

為了提高效率,請考慮使用像char *p = buffer這樣的寫指針,並使用p += sprintf(p, "%02X", (ch & 0x00FF))提高寫位置。

另外, if(loop == sz2) break檢查是while(loop < sz2)檢查的無用重復。 如果loop等於或大於sz2 ,則while循環將不會執行。

還想知道為什么只需要一個字符時就使用fread fgetcgetc似乎是一個更好的選擇。

另外,無論您使用fread還是getc都需要檢查文件結尾。 如果文件中沒有 sz2字節怎么辦? 因為所有現代系統都是多進程和多用戶的,所以有人可能會在調用ftell之后將文件切短。 您永遠不要假設事情,因為即使您檢查了它,它也可能會改變。 做出此假設是導致TOCTTOU(檢查時間到使用時間)錯誤的原因。

do_file() ,您正在while循環中復制單個字節的十六進制值。 因此,您應該在while循環的每次迭代中轉到字符數組buffer的下一個字節,即buffer++strcpy(buffer[loop], msg);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM