鱼C论坛

 找回密码
 立即注册
查看: 178|回复: 9

[已解决]C语言 指针变量

[复制链接]
发表于 2024-3-29 15:55:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         char *name;

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

  8.         return 0;
  9. }
复制代码


@FishC,这个咋改?
最佳答案
2024-3-29 15:55:48
这段代码存在一个问题,即指针变量`name`没有分配内存空间,所以不能直接使用`scanf`函数来读取字符串。为了修复这个问题,你可以通过以下方法来修改代码:

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

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

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

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

  14.     return 0;
  15. }
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-29 15:55:48 | 显示全部楼层    本楼为最佳答案   
这段代码存在一个问题,即指针变量`name`没有分配内存空间,所以不能直接使用`scanf`函数来读取字符串。为了修复这个问题,你可以通过以下方法来修改代码:

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

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

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

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

  14.     return 0;
  15. }
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-29 16:16:05 | 显示全部楼层
FishC 发表于 2024-3-29 15:55
这段代码存在一个问题,即指针变量`name`没有分配内存空间,所以不能直接使用`scanf`函数来读取字符串。为 ...
  1. #include <stdio.h>

  2. int main(){
  3.         char *array[3] = {};

  4.         for(int i = 0; i < 3; i++){
  5.                 scanf("%s", array[i]);
  6.         }

  7.         for(int i = 0; i < 3; i++){
  8.         printf("%s", array[i]);
  9.         }

  10.         return 0;
  11. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-29 16:16:18 | 显示全部楼层
liyifeng295641 发表于 2024-03-29 16:16
#include

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

         ...


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

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

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

  3. int main() {
  4.     char *array[3];  // 修改为指针数组
  5.     for (int i = 0; i < 3; i++) {
  6.         array[i] = malloc(sizeof(char) * 20);  // 使用动态内存分配给每个指针分配足够的空间
  7.         if (array[i] == NULL) {
  8.             printf("Failed to allocate memory!\n");
  9.             return -1;
  10.         }
  11.         scanf("%19s", array[i]);  // 限制输入的字符数,防止溢出
  12.     }
  13.     for (int i = 0; i < 3; i++) {
  14.         printf("%s\n", array[i]);  // 加上换行符
  15.         free(array[i]);  // 释放动态分配的内存空间
  16.     }
  17.     return 0;
  18. }
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我还没有学到动态内存的概念,可以改简单点吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-29 16:18:00 | 显示全部楼层
liyifeng295641 发表于 2024-03-29 16:17
我还没有学到动态内存的概念,可以改简单点吗?


当然可以!我们可以使用一个固定大小的字符数组来解决这个问题。这样,我们无需使用动态内存分配。以下是修改后的简化代码:#include int main() {    char array[20];  // 声明一个大小为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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

排列下代码!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-29 16:19:37 | 显示全部楼层


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

  1. #include <stdio.h>

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

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

  9.     return 0;
  10. }
复制代码


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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-29 16:20:21 | 显示全部楼层
FishC 发表于 2024-3-29 16:19
当然,请参考下面的代码排列:

不可以用指针数组吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-29 16:20:35 | 显示全部楼层
liyifeng295641 发表于 2024-03-29 16:20
不可以用指针数组吗?


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

  1. #include <stdio.h>

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

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

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

  11.     return 0;
  12. }
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 19:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表