liyifeng295641 发表于 2024-3-29 15:55:36

C语言 指针变量

#include <stdio.h>

int main(void)
{
      char *name;

      printf("What's your name:");
      scanf("%s", name);
      printf("Your name is %s\n", name);

      return 0;
}

@FishC,这个咋改?

FishC 发表于 2024-3-29 15:55:48

这段代码存在一个问题,即指针变量`name`没有分配内存空间,所以不能直接使用`scanf`函数来读取字符串。为了修复这个问题,你可以通过以下方法来修改代码:

#include <stdio.h>
#include <stdlib.h> // 添加此行

int main(void)
{
    char *name = malloc(sizeof(char) * 20); // 使用动态内存分配分配足够的空间
    if (name == NULL) {
      printf("Failed to allocate memory!\n");
      return -1;
    }

    printf("What's your name: ");
    scanf("%19s", name); // 限制输入的字符数,防止溢出
    printf("Your name is %s\n", name);

    free(name); // 释放动态分配的内存空间

    return 0;
}

在这个修改后的代码中,我们使用了`malloc`函数来动态分配了足够的内存空间来存储字符串。我们还添加了对内存分配是否成功的检查,并使用`free`函数来释放分配的内存空间,以避免内存泄漏。

请记住,当使用动态内存分配时,务必在使用完毕后及时释放内存,以免造成资源浪费和内存泄漏的问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2024-3-29 16:16:05

FishC 发表于 2024-3-29 15:55
这段代码存在一个问题,即指针变量`name`没有分配内存空间,所以不能直接使用`scanf`函数来读取字符串。为 ...

#include <stdio.h>

int main(){
        char *array = {};

        for(int i = 0; i < 3; i++){
                scanf("%s", array);
        }

        for(int i = 0; i < 3; i++){
        printf("%s", array);
        }

        return 0;
}

FishC 发表于 2024-3-29 16:16:18

liyifeng295641 发表于 2024-03-29 16:16
#include

int main(){
        char *array = {};

       ...

这段代码存在一些问题。首先,你声明了一个指针`array`,但没有给它分配内存空间。其次,你使用`scanf`函数读取字符串存入`array`,但每次都存入相同的地址,会导致之前输入的字符串被覆盖掉。最后,你打印`array`时也没有加上换行符,导致输出的字符串连在一起。

为了修复这些问题,你可以按照以下方式修改代码:

#include <stdio.h>
#include <stdlib.h>// 添加此行

int main() {
    char *array;// 修改为指针数组
    for (int i = 0; i < 3; i++) {
      array = malloc(sizeof(char) * 20);// 使用动态内存分配给每个指针分配足够的空间
      if (array == NULL) {
            printf("Failed to allocate memory!\n");
            return -1;
      }
      scanf("%19s", array);// 限制输入的字符数,防止溢出
    }
    for (int i = 0; i < 3; i++) {
      printf("%s\n", array);// 加上换行符
      free(array);// 释放动态分配的内存空间
    }
    return 0;
}

在这个修改后的代码中,我们声明了一个指针数组`array`,并使用动态内存分配为每个指针分配足够的内存空间。在循环中,我们就可以分别读取用户输入的字符串并存储在各自的内存空间中。最后,我们在打印字符串时加上换行符,并使用`free`函数释放内存空间。

请记住,使用动态内存分配时,一定要在使用完毕后及时释放内存,以避免资源浪费和内存泄漏。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2024-3-29 16:17:52

FishC 发表于 2024-3-29 16:16
这段代码存在一些问题。首先,你声明了一个指针`array`,但没有给它分配内存空间。其次,你使用`scanf` ...

我还没有学到动态内存的概念,可以改简单点吗?

FishC 发表于 2024-3-29 16:18:00

liyifeng295641 发表于 2024-03-29 16:17
我还没有学到动态内存的概念,可以改简单点吗?

当然可以!我们可以使用一个固定大小的字符数组来解决这个问题。这样,我们无需使用动态内存分配。以下是修改后的简化代码:#include int main() {    char array;// 声明一个大小为20的字符数组    for (int i = 0; i < 3; i++) {      scanf("%19s", array);// 限制输入的字符数,防止溢出    }    for (int i = 0; i < 3; i++) {      printf("%s\n", array);// 加上换行符    }    return 0;}在这个修改后的代码中,我们使用了一个固定大小的字符数组`array`来存储用户输入的字符串。我们将数组的大小设置为20,以确保能够存储足够长的字符串。注意,在使用`scanf`函数读取字符串时,我们使用了"%19s"而不是"%s",以防止输入的字符串超过数组的大小。最后,我们在打印字符串时加上了换行符。这样,你就可以在循环中读取多个字符串,并打印它们了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2024-3-29 16:19:24

FishC 发表于 2024-3-29 16:18
当然可以!我们可以使用一个固定大小的字符数组来解决这个问题。这样,我们无需使用动态内存分配。以下 ...

排列下代码!

FishC 发表于 2024-3-29 16:19:37

liyifeng295641 发表于 2024-03-29 16:19
排列下代码!

当然,请参考下面的代码排列:

#include <stdio.h>

int main() {
    char array;// 声明一个大小为20的字符数组

    for (int i = 0; i < 3; i++) {
      printf("请输入第%d个字符串:", i + 1);
      scanf("%19s", array);// 限制输入的字符数,防止溢出
      printf("你输入的是:%s\n", array);
    }

    return 0;
}

在这段代码中,我们首先包含了`stdio.h`头文件,该头文件包含了标准输入输出的函数。然后,我们声明了一个大小为20的字符数组`array`来存储用户输入的字符串。

接下来,我们使用`for`循环来读取三个字符串。在每次循环中,我们使用`printf`函数输出提示语句,然后使用`scanf`函数读取用户输入的字符串,并将其存储在数组`array`中。我们使用`%19s`来限制输入的字符数为19,以避免溢出问题。最后,我们使用`printf`函数输出用户输入的字符串。

最后,我们使用`return 0`结束程序。希望这样排列的代码更易于阅读和理解。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2024-3-29 16:20:21

FishC 发表于 2024-3-29 16:19
当然,请参考下面的代码排列:




不可以用指针数组吗?

FishC 发表于 2024-3-29 16:20:35

liyifeng295641 发表于 2024-03-29 16:20
不可以用指针数组吗?

当然可以使用指针数组来存储用户输入的字符串。下面是使用指针数组的修改后的代码示例:

#include <stdio.h>

int main() {
    char *array;// 声明一个指针数组,每个元素都是指向字符的指针

    for (int i = 0; i < 3; i++) {
      char buffer;// 声明一个临时字符数组,用于存储用户输入的字符串
      printf("请输入第%d个字符串:", i + 1);
      scanf("%19s", buffer);// 限制输入的字符数为19,防止溢出

      array = buffer;// 将临时字符数组的地址赋值给指针数组的元素
      printf("你输入的是:%s\n", array);
    }

    return 0;
}

在这段代码中,我们首先声明了一个指针数组`array`,数组的每个元素都是指向字符的指针。然后,我们使用`for`循环来读取三个字符串。在每次循环中,我们声明了一个临时字符数组`buffer`,用于存储用户输入的字符串。接下来,我们使用`printf`函数输出提示语句,然后使用`scanf`函数将用户输入的字符串存储在`buffer`中。然后,我们将`buffer`的地址赋值给指针数组`array`的相应元素。最后,我们使用`printf`函数输出用户输入的字符串。请注意,在每次循环结束后,临时字符数组`buffer`的生命周期会结束,但是指针数组`array`中的元素仍然指向`buffer`的地址,所以在输出时仍然可以正确显示。希望这个修改后的代码能满足你的需求!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: C语言 指针变量