【问题标题】:pointer being assigned values with a loop使用循环为指针赋值
【发布时间】:2015-07-27 14:29:57
【问题描述】:

我正在尝试创建一个包含 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;
}

【问题讨论】:

  • 难怪,你没有为字符串分配内存,而是用野指针对着大象射击。请阅读指针和内存分配。你错过了最基本的 - 没有冒犯。
  • 什么是字符串?指针不会伤害我...
  • 当使用 '%s' 格式字符串调用 scanf() : 1) 时,始终包含最大长度修饰符,即 I.E. scanf("%25s", string[i]); (即使这将失败,除非为 10 个字符串指针中的每一个执行了至少 26 个字符的内存分配。) 2)始终检查返回值(而不是参数值)以确保操作成功。在这种情况下,==1 是成功的 3) %s 格式说明符在遇到任何空格(如换行符)时停止,因此发布的代码(scanf)将在第一次迭代后失败。建议“%25s”(注意前导空格)

标签: c loops pointers scanf


【解决方案1】:

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

char * string[10];

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

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

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

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

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

  2. 您的第二个参数必须是您要存储输入的变量。您提供了“字符串 [i]”。请记住,在 C 中,字符串只是字符数组。但是,您的变量“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]);
}

【讨论】:

    【解决方案2】:

    您需要动态分配内存或制作二维数组:

    char string[10][100];
    

    【讨论】:

      【解决方案3】:

      你可以做这样的事情来分配内存 -

        for(i=0;i<10;i++){
        string[i]=malloc(sizeof(char)*10); 
        }         
      

      这样你的程序就不会出错。
      但在此之后,您必须释放分配的内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 2010-09-11
        • 2019-07-10
        • 2019-02-09
        • 1970-01-01
        • 2011-01-20
        相关资源
        最近更新 更多