创建数组

时间:2015-10-27 20:29:38

标签: c arrays variables dynamic declaration

我希望make数组将动态声明我想象somethnig就像这样。我想要make程序识别单词中的字符。

char i;
scanf("%c",&i);
char word[]=i;
printf("%c",word[0]);

我也试过这样的事情

char i;
scanf(%c,&i);
char *word=i;
printf("%c",word[0]);

我不知道如何让它发挥作用

1 个答案:

答案 0 :(得分:2)

让我们从基础开始吧。你在写作时声明的是什么:

char word[]=i;

是一个字符数组,它将根据=符号右侧的内容进行初始化。在这种情况下,i是单个字符(即使技术上是无效的初始化程序)。所以基本上你试图声明一个大小为1的字符数组。

如果允许,word不会是字符字符串,因为它不是(也可能不是)null-terminated。它只是char类型的数组,不能用作字符串。 (注意char word[]="i";可以工作 - 并且是空终止的)

当您将word声明为:

char *word=i;

您创建了一个指向 指针

(指针只包含存储在内存中的其他内容的地址作为其值,在这种情况下,您将该地址设置为i的值,该值可能在系统保留的内存范围内,可能会导致立即分段错误。

你可能想要的是:

i

char *word=&i; 地址存储为word的值。虽然这会给你一个指向i的字符指针,但除了涉及指针之外,它与动态分配无关。

要动态地正确分配i,您仍然需要创建一个名为word的指针,但是您需要分配word将指向的内存块。 (指向该内存块的起始地址)。因此,要为word动态分配空间,您可能会看到类似的内容:

word

然后你有一个指针char *word = NULL; /* initialization to NULL is good practice */ word = malloc (numbytes * sizeof *word); /* allocate numbytes of storage */ ,它的值是(word)字节大小的新内存块的起始地址。 (因为numbytes x sizeof *word只是sizeof *word,其值为sizeof (char))。所以你已经创建了一个大小为1的内存块。

对于该内存块,您有两个责任(1)您必须保留指向该块起始地址的指针;所以(2)当不再需要时,你可以numbytes。 (1)表示代码中没有free。如果需要迭代指针值,请创建一个指针,例如:

word++;, etc..

然后,您可以在char *p = word; 上使用指针算法,而不会影响p的值。

然后你可以按照自己喜欢的方式填写单词,只要你在最后为空终止符留空间(如果你打算将它用作字符串)并且不要尝试写超过{{1有价值的数据。

因此,在您的情况下,如果您的意图是动态分配word以将字符numbytes保存为字符串,则可以轻松完成:

word

注意:使用i时,只要遇到第一个空格,就会停止阅读。您可能希望使用char *word = NULL; word = malloc (10 * sizeof *word); if (!word) { /* always validate each allocation */ fprintf (stderr, "error: virtual memory exhausted.\n"); return 1; } if (scanf ("9%s", word)) printf ("word contains '%s'\n", word); free (word); ,其中基本上说scanf ("9%s", word) 最多可读取9个字符(不包含scanf ("9%[^\n]%*c", word),然后%9[^\n] < em>读取并丢弃换行符,不用将其添加到\n返回的匹配计数。所以你的测试:

%*c

保险scanf已将至少一个字符读入if (scanf ("9%s", word)) 作为字符串(空终止字),成功读取时将其添加到{{>匹配计数中{{ 1}}制作scanf。然后由word返回匹配计数,确保您只在成功阅读后打印。

另请注意:通过在格式字符串中包含宽度说明符scanf(或match count = 1),将读取的字符scanf的数量限制为scanf。这可以确保您无法在分配给word的内存结束时写入,同时保证可用于空终止字符串的空间。

另一个人。如果您希望用户输入数据,那么提示用户输入数据,这样用户就不会在屏幕上看到闪烁的光标,想知道程序是否挂断,等等。将所有这些放在一起作为一个简短的例子。

9

使用/输出

%9s

如果您有任何问题,请与我们联系。