C语言 将缓冲区转换为字符串数组

d7v8vwbk  于 2022-12-11  发布在  其他
关注(0)|答案(3)|浏览(241)

我把文本从编辑域下载到缓冲区,我想把它转换成一个字符串数组。每个字符串都以%结尾。

void Converter(HWND hwnd)
{
    int Length = GetWindowTextLength(hEdit) + 1;
    LPSTR data = (LPSTR)malloc(Length);
    char set[500][11];

    GetWindowTextA(hEdit, data, Length);

    int x = 0, y = 0;
    char record[10];
    
    for (int i = 0; i < Length, x<500; i++)
    {
        if(data[i]!= '\0' )
            {
            record[y] = data[i];
            y++;
            }
        else if(data[i] == '%')
        {
            strcpy(set[x], record);
            x++;
            y = 0;
        }
    }
    free(data);
}

我收到的错误消息:

Exception thrown at location 0x00007FF684C91F9B in myproject.exe: 0xC0000005: Access violation while reading at location 0x000000CBFC8D5DAF.
zvms9eto

zvms9eto1#

问题就出在这一行

for (int i = 0; i < Length, x<500; i++)

你的条件不对,应该是:

for (int i = 0; i < Length && x<500; i++)

此外,else if区块永远不会执行,因为'%'不相等'\0'。这可以透过交换它们来修正。

if(data[i] == '%')
{
    strcpy(set[x], record);
    x++;
    y = 0;
}
else if(data[i] != '\0')
{
    record[y] = data[i];
    y++;
}

第三个问题是%分隔字符串的最后一个单词不会被复制到set中,因为它后面没有百分号。
还有一个bug。你在复制之前忘记在记录的末尾放一个空终止符,这会导致较短的字符串保留以前的字母。

record[y] = '\0';
strcpy(set[x], record);

在这一点上,我建议使用<string.h>中的strtok,以及像Rust这样的内存安全编程语言。

hmmo2u0o

hmmo2u0o2#

你可以这样做

char** make_array(_In_ char* buf, _Out_ unsigned* pn)
{
    char* pc = buf;
    unsigned n = 1;
    
    while(pc = strchr(pc, '%')) n++, *pc++ = 0;

    if (char** arr = new char*[n])
    {
        *pn = n;

        char** ppc = arr;
        
        do {
            *ppc++ = buf;
            buf += strlen(buf) + 1;
        } while(--n);

        return arr;
    }

    *pn = 0;
    return 0;
}

void demo()
{
    char buf[] = "1111%2222%33333";
    unsigned n;
    if (char** arr = make_array(buf, &n))
    {
        char** ppc = arr;
        do {
            printf("%s\n", *ppc++);
        } while (--n);
        delete [] arr;
    }
}
zd287kbt

zd287kbt3#

使用示例代码显示带2D数组的strcpy:

#include <stdio.h>

int main() {
   
    char set[500][11];
    
    strcpy(&set[x][0], "a record");

    printf(">> %s", &set[x][0]);
}

输出量:

>> a record

相关问题