Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C语言中的字符创建字符串数组_C_String_Char - Fatal编程技术网

使用C语言中的字符创建字符串数组

使用C语言中的字符创建字符串数组,c,string,char,C,String,Char,当我这么做的时候 char *paths[10]; paths[0] = "123456"; printf(1,"%s\n",paths[0]); printf(1,"%c\n",paths[0][2]); 输出: 123456 3 (null) 3 但当我看到你这么做的时候 char *paths[10]; paths[0][0]='1'; paths[0][1]='2'; paths[0][2]='3'; paths[0][3]='4'; paths[0][4]='5'; paths

当我这么做的时候

char *paths[10];
paths[0] = "123456";

printf(1,"%s\n",paths[0]);
printf(1,"%c\n",paths[0][2]);
输出:

123456
3
(null)
3
但当我看到你这么做的时候

char *paths[10];
paths[0][0]='1';
paths[0][1]='2';
paths[0][2]='3';
paths[0][3]='4';
paths[0][4]='5';
paths[0][5]='6';
printf(1,"%s\n",paths[0]);
printf(1,"%c\n",paths[0][2]);
输出:

123456
3
(null)
3
为什么在这种情况下为空?

如何使用C中的字符创建字符串数组?我对C有点陌生,觉得用C编程有些困难

路径
是一个指向字符的10个指针数组。但是,初始元素是无法取消引用的指针。它们是(对于函数中的数组)或NULL(对于静态数组)。野生指针是未初始化的指针

我猜你的是静态的,因为路径[0]是
NULL
。然而,这可能是巧合

当您取消引用
NULL
或未初始化的指针时,您正在读取或写入不属于自己的内存。这会导致未定义的行为,包括程序崩溃

你真幸运,它没有崩溃。这可能是因为编译器看到您正在将常量写入路径[0][2],并将您的
printf
更改为直接打印常量。你不能相信这一点

如果希望有一个允许写入的指针,请执行以下操作:

paths[0] = malloc(string_length + 1);
string\u length
是您可以写入的字符数。1给你一个NUL的空间。完成后,您必须
释放它

char *paths[10];
paths[0][0]='1';

路径
是指针数组<代码>路径
未初始化为任何内容。所以,它有垃圾值。您需要使用
malloc
来分配内存。你只是运气不好,这个程序实际上在默默地工作。想想
路径[0][0]
将产生什么地址位置来分配1

另一方面,这起作用是因为-

char *paths[10];
paths[0] = "123456";
“123456”
是驻留在只读位置的字符串文字。因此,它返回路径[0]所在位置的起始地址。正确申报-

const char* paths[10];

对于第二个示例,如果您知道每个字符串的大小,则可以编写

char paths[10][6];
paths[0][0]='1';


这样,您就有了10个长度为6的字符串(并且只使用到目前为止的第一个字符串)。

各种答案提供了许多选项,我只是补充几点。 您可以按如下方式创建字符串数组:
I.您可以创建只读字符串数组,如下所示:

char *string_array0[] = {"Hello", "World", "!" };
这将创建3个只读字符串的数组。在这种情况下,您不能修改字符串的字符,即
string_array0[0][0]='R'是非法的。
二,。您可以声明指针数组并根据需要使用它们

char *string_array1[2]; /* Array of pointers */
string_array1[0] = "Hey there"; /* This creates a read-only string */
/* string_array1[0][0] = 'R';*/ /* This is illegal, don't do this */
string_array1[1] = malloc(3); /* Allocate memory for 2 character string + 1 NULL char*/
if(NULL == string_array1[1])
{
/* Handle memory allocation failure*/
}

string_array1[1][0] = 'H';
string_array1[1][1] = 'i';
string_array1[1][2] = '\0'; /* This is important. You can use 0 or NULL as well*/
...
/* Use string_array1*/
...
free(string_array1[1]); /* Don't forget to free memory after usage */
三、 可以声明二维字符数组

char string_array2[2][4]; /* 2 strings of atmost 3 characters can be stored */
string_array2[0][0] = 'O';
string_array2[0][1] = 'l';
string_array2[0][2] = 'a';
string_array2[0][3] = '\0';

string_array2[1][0] = 'H';
string_array2[1][1] = 'i';
string_array2[1][2] = '\0'; /* NUL terminated, thus string of length of 2 */  
四、 您可以使用指针对指针

char ** string_array3; 
int i;
string_array3 = malloc(2*sizeof(char*)); /* 2 strings */
if(NULL == string_array3)
{
        /* Memory allocation failure handling*/
}

for( i = 0; i < 2; i++ )
{
    string_array3[i] = malloc(3); /* String can hold at most 2 characters */
    if(NULL == string_array3[i])
    {
        /* Memory allocation failure handling*/
    }
}

strcpy(string_array3[0], "Hi");

string_array3[1][0]='I';
string_array3[1][1]='T';
string_array3[1][2]='\0';

/*Use string_array3*/

for( i = 0; i < 2; i++ )
{
    free(string_array3[i]);
}

free(string_array3);
char**string\u array3;
int i;
string_array3=malloc(2*sizeof(char*);/*2串*/
if(NULL==string_array3)
{
/*内存分配失败处理*/
}
对于(i=0;i<2;i++)
{
string_array3[i]=malloc(3);/*字符串最多可容纳2个字符*/
if(NULL==string_array3[i])
{
/*内存分配失败处理*/
}
}
strcpy(字符串数组3[0],“Hi”);
字符串_数组3[1][0]='I';
字符串_数组3[1][1]='T';
字符串_array3[1][2]='\0';
/*使用字符串数组3*/
对于(i=0;i<2;i++)
{
自由(字符串数组3[i]);
}
自由(字符串_数组3);
要记住的要点:

  • 如果要创建只读字符串,则无法更改字符 在字符串中

  • 如果要填充字符数组,请确保 内存以容纳NUL字符并确保终止 使用NUL字符的字符串数据

  • 如果您使用的是指针& 分配内存,确保检查内存分配是否完成 正确&使用后释放内存
  • 使用中的字符串函数
    string.h
    用于字符串操作
希望这有帮助

附言:
printf(1,“%S\n”,路径[0])看起来很阴暗

您可以自己定义字符串,然后

#inlcude <stdio.h>
基本上你可以做到这一点

string paths = "123456";
printf("%s\n", paths);
return 0;
所以你的代码看起来像这样

#include <stdio.h>
typedef char string[];

int main() {
    string paths = "123456";
    printf("%s", paths);
}
#包括
typedef字符字符串[];
int main(){
字符串路径=“123456”;
printf(“%s”,路径);
}

我对C语言几乎是新手,你能帮我创建一个使用字符的字符串数组吗,就像我在第二个例子中尝试做的那样?相反,我明白了你的意思。当我执行
路径[0]=“123456”自动初始化为其长度(6)。但是当我执行路径[0][0]
时,它不知道数组的第二维度的大小。对吗?这与尺寸无关。字符串文本由底层实现自动分配内存。但是当您说
[0][0]
时,您正在尝试访问一个尚未分配的有效内存位置。在
路径[0][4]
之前,您应该只有值,
路径[0][5]
应该是NUL字符。问题是,在数组中存储时,我没有完整的字符串或其长度。因此,我必须一个字符一个字符地存储它。谢谢你详细的回答。@lifeh20:在这种情况下,使用指针数组&malloc。如果您不确定字符串的数量,还有另一个选项。使用指针对指针。您知道使用时字符串的数量吗?不,我实际上是在解析文件并通过检查分隔符将字符串存储在数组中(预定义大小)。