我希望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]);
我不知道如何让它发挥作用
答案 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
如果您有任何问题,请与我们联系。