使用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。如果您不确定字符串的数量,还有另一个选项。使用指针对指针。您知道使用时字符串的数量吗?不,我实际上是在解析文件并通过检查分隔符将字符串存储在数组中(预定义大小)。