使用C中的Characters创建一个字符串数组

时间:2011-09-28 04:50:45

标签: c string char

当我这样做时

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

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

输出:

123456
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]);

输出:

(null)
3

为什么在这种情况下它为空?
如何使用C中的字符创建字符串数组?我对C有点新,感觉在C中编程有些困难

5 个答案:

答案 0 :(得分:4)

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

char *string_array0[] = {"Hello", "World", "!" };

这将创建3个只读字符串的数组。在这种情况下,您无法修改字符串的字符,即string_array0[0][0]='R'; 非法 II。你可以声明指针数组&根据需要使用它们。

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 */

III。您可以声明二维字符数组。

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 */  

IV。您可以使用指针指针。

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);

要记住的要点:

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

  • 如果要填充字符数组,请确保已填写 内存以容纳NUL角色和确保你终止你的 带有NUL字符的字符串数据。

  • 如果您使用指针&amp; 分配内存,确保检查内存分配是否完成 正确的&amp;使用后释放内存。
  • 使用字符串函数 string.h用于字符串操作。

希望这有帮助!
P.S。:printf(1,"%s\n",paths[0]);看起来很阴暗

答案 1 :(得分:2)

paths是一个包含10个char指针的数组。但是,初始元素是无法解除引用的指针。这些是wild(对于函数中的数组)或静态数组的NULL。野指针是未初始化的指针。

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

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

你真的很幸运,它没有崩溃。这可能是因为编译器看到您正在向paths[0][2]写一个常量,并更改您的printf以直接打印常量。您可以依赖此。

如果你想要一个你可以写的指针,请执行:

paths[0] = malloc(string_length + 1);

string_length是您可以编写的字符数。 1给你一个NUL的空间。完成后,您必须free

答案 2 :(得分:2)

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

paths是一个指针数组。 paths未初始化为任何内容。所以,它有垃圾值。您需要使用malloc使用分配内存。你不幸的是,这个程序实际上是默默无闻的。想一想paths[0][0] 1 分配给它的地址位置。

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

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

"123456"是一个驻留在只读位置的字符串文字。因此,它返回paths[0]持有的该位置的起始地址。要正确宣布 -

const char* paths[10];

答案 3 :(得分:1)

对于你的第二个例子,如果你知道你可以写的每个字符串的大小,例如

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

...

paths[0][5]='6';

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

答案 4 :(得分:0)

您可以在

之后自己定义字符串
#inlcude <stdio.h>
像这样

typedef char string[];

在主要内容你可以做到这一点

string paths = "123456";
printf("%s\n", paths);
return 0;

所以你的代码看起来像这样

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

int main() {
    string paths = "123456";
    printf("%s", paths);
}