创建一个字符串数组 运行 在 C 中使用与字符串相关的函数对其进行测试

Create an array of string to run tests over them with string related functions in C

我试图了解我的代码有什么问题以及我对 C 中的指针、数组和字符串的理解。

我尝试创建一个字符串数组,以便能够对其进行循环并测试任何将字符串作为参数的函数。 在这种情况下,我正在尝试检查名为 Memset.

memset 的私人植入

这是我的代码:

#include <stdio.h>
#include <string.h>

/*First Try, did not work: */

/*const char * strings_array[] = {*/
/*    "First string",*/
/*    "213123Second_string3",*/
/*    "",*/
/*    "-3",*/
/*    "s",*/
/*};*/

/* Second try, also does not work: */

const char **strings_array = (char *[]){"a", "b", "c"};

int main () 
{

    while(*strings_array)
    {
    char *string = strings_array;
    printf( "Before Memset, target is \"%s\"\n", *string );
    if (NULL == Memset(*string, '$', 4))
    {
        fprintf(stderr,"Memset failed!\n");
    }
    printf( "After Memset, target is \"%s\"\n\n", *string );
    
    ++strings_array;
    }
return (0);
}

我知道 C 中的 string 不是 type 而是 char *。 但是也是一个string literal,也就是说我不能改,只能看

这就是它不起作用的原因? 因为我将它传递给 Memset 并且 Memset 试图更改它,但由于它是字符串文字而无法更改?

这是我对Memset函数的植入:

void *Memset(void *str, int c, size_t n)
{
        unsigned char *string = str;
        
        if (NULL == str)
        {
            return (NULL);
        }
        
        while(n > 0)
        {
            *string++ = (unsigned char) c;
            --n;
        }

    return (str);
}

您的评价是正确的。您正在创建一个 char * 数组并将这些指针初始化为字符串常量的地址,并且字符串常量无法修改。

不是定义 char * 的数组,而是定义 char 的二维数组。当您使用字符串常量初始化数组时,数组本身是可写的。

char strings_array[][50] = {
    "First string",
    "213123Second_string3",
    "",
    "-3",
    "s",
};

请注意,对于多维数组,如果有初始值设定项,则只有第一维可以省略大小。

我突然想到的第一个错误是在 Memset 中你间接地将 void* 转换为 unsigned char *。我会将其更改为显式转换:unsigned char *string = (unsigned char *)str;

其次,您完全正确:不能修改字符串文字。尝试修改字符串文字会导致错误。

为了测试这段代码,我会尝试在堆上分配一个字符串数组,将一些测试字符串加载到其中,然后将字符串指针从该数组传递到 Memset 函数中。