创建一个字符串数组 运行 在 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 函数中。
我试图了解我的代码有什么问题以及我对 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 函数中。