如果我的字符串没有空终止符,如何返回null

这是我第一次在这里发帖很抱歉,如果我做错了什么。

我有一个C程序分配一个池,然后在内存中存储一​​个char数组“Hello World”,然后检索它。 我的主要方法中的代码行之一是:

store(pool, 50, sizeof(str) - 1, str);

(我的商店方法变量是(Pool * pool,int offset,int size,void * object)

如果我正确读取它,那么被分配的池比字符串大小小1,所以剪切 0将会结束。

我该如何检查该字符在最后失踪并因为它而返回null?

/* _POOL - pool 
 * int size - the size of the pool in bytes
 * void* ipPool - pointer to memory malloc'd by the operating system 
 */

typedef struct _POOL
{
    int size;
    void* memory;
} Pool;

/* Allocate a memory pool of size n bytes from system memory (i.e., via malloc()) 
 * and return a pointer to the filled data Pool structure */
Pool* allocatePool(int n)
{
    if(n <= 0)
    {
            return NULL;
    }

    Pool *pool = malloc(sizeof *pool);

    if(!pool)
    {
            return NULL;
    }

    pool->size = n;

    if(!(pool->memory = malloc(n)))
    {
            return NULL;
    }

    return pool;
};

/* Free a memory pool allocated through allocatePool(int) */
void freePool(Pool *pool)
{
    if(!pool)
    {
             return;
    }

    if(pool->memory)
    {
            free(pool->memory);
    }

    free(pool);
};

/* Store an arbitrary object of size n bytes at
 * location offset within the pool */
void store(Pool *pool, int offset, int size, void *object)
{
    if(!pool)
    {
            return;
    }

    if(size + offset > pool->size)
    {
            return;
    }

    memcpy(pool + offset, object, size);
};

/* Retrieve an arbitrary object of size n bytes 
 * from a location offset within the pool */
void *retrieve(Pool *pool, int offset, int size)
{
    if(!pool)
    {
            return NULL;
    }

    void *obj = malloc(size);

    if(!obj)
    {
            return NULL;
    }

    if(size + offset > pool->size)
    {
            return NULL;
    }

    return memcpy(obj,  pool + offset, size);
};

void main()
{
    const int poolSize = 500;
    Pool* pool;
    int x = 5;
    char c = 'c';
    char str[] = "Hello World";

    /* Should retrieve Hello World */
    store(pool, 8, sizeof(str), str);
    printf("Test 4: Store an arbitrary multi-byte valuen");
    printf("tStored: %sn", str);
    printf("tRetrieves: %sn", (char*)retrieve(pool, 8, sizeof(str)));

    /* Should retrieve null */
    store(pool, 50, sizeof(str) - 1, str);
    printf("Test 5: Store an arbitrary multi-byte value with no null terminatorn");
    printf("tStored: %sn", str);
    printf("tRetrieves: %sn", (char*)retrieve(pool, 50, sizeof(str) - 1));
};

是我认为涉及的所有代码。 这是目前正在放入Hello World并检索Hello World。

我无法编辑任何主要方法,只能编辑函数和结构的内容。


如果删除了尾随空字符,则会删除编码该字符串长度的唯一信息。 没有办法查询分配块的大小。

这是因为终止零是C编码字符串长度的方式。 其他语言的运行时使用不同的方法,比如将字符串长度(作为字节或字)存储在字符串引用变量(例如Delphi)指向的第一个字节中。

因此无法检测尾部空缺是否丢失。 如果它在那里,您可以搜索它。 如果不存在,则搜索将不可避免地访问字符串最后一个字节后面的内存位置,并且无法正常工作。

而且由于对空字符的搜索(或扫描)正是strlen所做的,所以当然不能使用strlen


这显示了如何测试是否有字符串终止符。

在第一种情况下, str会自动调整大小,并包含''终止符。

在第二种情况下, xyz已经定义了数组大小,因此没有任何终结符的空间。

#include <stdio.h>

char *pool(char *str, size_t size)
{
    size_t i;
    for(i=0; i<size; i++) {
        if(str[i] == '') {
            return str;
        }
    }
    return NULL;
}

int main(void)
{
    char str[] = "Hello World";
    char xyz[11] = "Hello World";

    if(pool(str, sizeof str) == NULL) {
        printf("No terminatorn");
    }
    else {
        printf("'%s' is good!n", str);
    }

    if(pool(xyz, sizeof xyz) == NULL) {
        printf("No terminatorn");
    }
    else {
        printf("'%s' is good!n", xyz);
    }
    return 0;
}

节目输出:

'Hello World' is good!
No terminator

由于内存池是一个自由形式的池,如果它们取消了返回的空字符,那么这就是他们自己的错误。 但是,由于您只是在retrieve复制对象,因此您可以自己添加一个额外的空终止符:

void *obj = malloc(size + 1);
*((char*)(obj) + size) = 0; // add the null character

有了这个,即使最终用户决定取消空终止符,也最终会出现,并且它通常会出现在正确的位置,因此如果没有空终止符,将永远不会导致无尽的遍历错误。

链接地址: http://www.djcxy.com/p/72175.html

上一篇: How do I return null if my string has no null terminator

下一篇: Main Menu choice prompt is gathered even on sub Function scanf (C)