我正在尝试创建一个包含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;
}
答案 0 :(得分:3)
您需要考虑用于存储字符串的数据结构。
char * string[10];
这声明了一个由10个元素组成的数组&#34; char *&#34;或&#34;指向char&#34;的指针。
现在想想你正在做什么这个操作。
scanf("%s", string[i]);
您正在使用scanf尝试读取用户输入。你的函数调用是否有意义?
第一个参数是您的格式字符串。 &#34;%S&#34;有道理,因为你希望用户为你提供一个字符串。我们暂时忽略你没有对输入的长度设置任何界限这一事实。
您的第二个参数必须是您要存储输入的变量。您已提供&#34; string [i]&#34;。请记住,在C中,字符串只是char数组。但是,你的变量&#34; string [i]&#34;有类型&#34; char *&#34;。这没有意义。如何存储&#34; char array []&#34;类型的数据?在变量类型&#34; char * array []&#34;?类型不同。
您需要创建一个缓冲区,您可以在其中存储输入字符串。类似的东西:
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]);
}
答案 1 :(得分:1)
您需要动态分配内存或制作二维数组:
char string[10][100];
答案 2 :(得分:0)
你可以做这样的事情来分配内存 -
firsts = my_second.firsts
seconds = my_first.seconds
这样你的程序就不会出错 但在此之后你必须释放分配的内存。