鱼C论坛

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

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

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

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

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

x
#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,这个咋改?
最佳答案
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

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

使用道具 举报

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

在这个修改后的代码中,我们声明了一个指针数组`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 | 显示全部楼层


当然,请参考下面的代码排列:
#include <stdio.h>

int main() {
    char array[20];  // 声明一个大小为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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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
不可以用指针数组吗?


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

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

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

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

    return 0;
}

在这段代码中,我们首先声明了一个指针数组`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-11-23 20:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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