gpt4 book ai didi

c - 使用循环为指针赋值

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:45 27 4
gpt4 key购买 nike

我正在尝试创建一个包含 10 个指针的数组,这些指针将在 for 循环中接收来自 scanf 的输入。然后我想调用该列表。但是,我收到内存运行时错误:

#include <stdio.h>

int main(void) {
int i;
char * string[10];
//printf("%s", *string[0]);
for(i = 0; i<3; i++)
{
printf("what is string");
scanf("%s", string[i]);
printf("%s", string[i]);
}
return 0;
}

最佳答案

您需要考虑您试图用来存储字符串的数据结构。

char * string[10];

这声明了一个包含 10 个“char *”或“指向 char 的指针”类型元素的数组。

现在想想你要用这个操作做什么。

scanf("%s", string[i]);

您正在使用 scanf 尝试读取用户输入。你的函数调用有意义吗?

  1. 第一个参数是您的格式字符串。 "%s"有意义,因为您希望用户为您提供一个字符串。让我们忽略您暂时没有对该输入的长度设置任何限制这一事实。

  2. 您的第二个参数必须是您要存储输入的变量。您提供了“string[i]”。请记住,在 C 中,字符串只是 char 数组。但是,您的变量“string[i]”的类型为“char *”。这没有意义。如何将“char * array[]”类型的数据存储在“char * array[]”类型的变量中?类型不同。

您需要创建一个缓冲区,您可以在其中存储您的输入字符串。像这样的东西:

char buffer[256];

然后你像这样调用scanf:

scanf("%s", buffer);

请记住,这不是最好的主意,因为您不知道用户可能会输入多少个字符。这将采用输入字符数组并将它们存储在正确表示该数据的变量中。

注意这个调用会更安全:

fgets(buffer, sizeof(buffer)/sizeof(char), stdin);

fgets 将从流中读取固定数量的字符。在上面的调用中,我通过获取缓冲区变量的长度来定义该数字。我除以 sizeof(char) 只是为了确保处理 char != 1 字节的任何奇怪的表示问题。另请注意,您最终会在缓冲区中返回 carraige(fgets 将获取它)。

一旦您将字符串保存在适当的变量中,您就可以保存它并获取指向该字符串副本的指针:

char * ptr = strdup(buffer);

这将创建存储在缓冲区中的字符串的新副本,并返回指向该新副本位置的指针。然后这个指针可以进入你的数组。

请注意,您不能只做:

string[i] = buffer

因为 string[i] 只是一个指向缓冲区变量的指针……在每次迭代中都会被覆盖!您最终会得到一个指向同一个变量的指针数组,这些指针最终都会给您相同的字符串(最后一个输入)。

像这样把它们放在一起:

char buffer[256];
printf("What is your string? ");
fgets(buffer, sizeof(buffer)/sizeof(char), stdin);
string[i] = strdup(buffer);

因为 strdup() 在后台使用 malloc,您需要在程序结束时释放所有字符串:

int i = 0;
for(; i < sizeof(string)/sizeof(char *); i++) {
if(string[i]) free(string[i]);
}

关于c - 使用循环为指针赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31655908/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com