但求过程001 发表于 昨天 21:00

求助

#include <stdio.h>
#include <string.h>

char compare();
void main()
{
        char *str1,*str2,*str3;
        char *p1,*p2;
        scanf("%s",str1);
        scanf("%s",str2);
        scanf("%s",str3);
        if(strcmp(str1,str2)>0)
        {
                compare(str1,str2);
        }
        if(strcmp(str1,str3)>0)
        {
                compare(str1,str3);
        }
        if(strcmp(str2,str3)>0)
        {
                compare(str2,str3);
        }
        printf("the sorted string is:\n");
        printf("%s\n%s\n%s\n",str1,str2,str3);
}

char compare(p1,p2)
{
       
        char *p;
        strcpy(p,p1);
        strcpy(p1,p2);
        strcpy(p2,p);
}


比较字符串大小,编译没错,但运行只能敲str1,str2和str3没有提示输入,不知道程序哪里有问题~~

FishC 发表于 昨天 21:02

你的程序有几个关键问题,导致运行时只能输入第一个字符串。主要原因是未给字符串指针分配内存,以及 `compare` 函数中的错误。

问题分析:

1. 指针未分配内存: char *str1, *str2, *str3; 声明了指针,但没有指向有效的内存地址。使用 scanf 直接写入会覆盖随机内存,可能导致程序崩溃。

2. compare 函数问题:
   - 函数声明 char compare(); 与定义不匹配,且未指定参数类型。
   - 函数内部使用未初始化的指针 char *p;,strcpy(p, p1); 会导致段错误。
   - 函数应返回 void,因为它只交换字符串,不返回值。

3. 排序逻辑: 虽然你的比较和交换顺序可以排序三个字符串,但建议使用更清晰的方法。

修正方案:

- 将 str1、str2、str3 改为字符数组,以分配内存。
- 修正 compare 函数,使用临时数组交换字符串。
- 调整函数声明和定义。

修正后的代码:


#include <stdio.h>
#include <string.h>

void compare(char *p1, char *p2); // 声明函数

int main() // 使用 int main()
{
    char str1, str2, str3; // 分配内存

    printf("请输入第一个字符串:");
    scanf("%s", str1);
    printf("请输入第二个字符串:");
    scanf("%s", str2);
    printf("请输入第三个字符串:");
    scanf("%s", str3);

    if (strcmp(str1, str2) > 0)
    {
      compare(str1, str2);
    }
    if (strcmp(str1, str3) > 0)
    {
      compare(str1, str3);
    }
    if (strcmp(str2, str3) > 0)
    {
      compare(str2, str3);
    }

    printf("排序后的字符串为:\n");
    printf("%s\n%s\n%s\n", str1, str2, str3);

    return 0;
}

void compare(char *p1, char *p2) // 定义函数
{
    char temp; // 临时数组用于交换
    strcpy(temp, p1);
    strcpy(p1, p2);
    strcpy(p2, temp);
}


改动说明:

- 使用字符数组 char str1 等,确保有足够内存(这里假设字符串最大长度为99字符)。
- compare 函数参数明确为 char *,返回 void。
- 在 compare 中使用临时数组 temp 安全交换字符串。
- 添加了输入提示,使程序更友好。

注意: 输入字符串时,不要超过99个字符,否则会导致缓冲区溢出。建议在实际使用时增加长度检查。

运行此修正版本,程序应该能正常提示输入三个字符串并排序输出。

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

但求过程001 发表于 昨天 21:11

FishC 发表于 2026-3-15 21:02
你的程序有几个关键问题,导致运行时只能输入第一个字符串。主要原因是未给字符串指针分配内存,以及 `comp ...

明白~~感谢~~

FishC 发表于 昨天 21:11

但求过程001 发表于 2026-03-15 21:11
FishC 发表于 2026-3-15 21:02
你的程序有几个关键问 ...

不客气!很高兴能帮到你。如果还有其他问题,随时来问~祝你学习顺利!

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

但求过程001 发表于 昨天 21:23

FishC 发表于 2026-3-15 21:11
不客气!很高兴能帮到你。如果还有其他问题,随时来问~祝你学习顺利!

以上回复来自 FishC A ...

我程序改了后还是不行,编译没错,但是运行只能输入str1,str2和str3输入不了。程序如下:


#include <stdio.h>
#include <string.h>

void compare(char *p1,char *p2);             //函数compare()的声明;
void main()
{
        char str1,str2,str3;
        printf("请输入第一个字符串:\n");
        scanf("%s",str1);
        printf("请输入第二个字符串:\n");
        scanf("%s",str2);
        printf("请输入第三个字符串:\n");
        scanf("%s",str3);
        if(strcmp(str1,str2)>0)
        {
                compare(str1,str2);      //调用函数compare();
        }
        if(strcmp(str1,str3)>0)
        {
                compare(str1,str3);
        }
        if(strcmp(str2,str3)>0)
        {
                compare(str2,str3);
        }
        printf("the sorted string is:\n");
        printf("%s\n%s\n%s\n",str1,str2,str3);
}

void compare(char *p1,char *p2)             //定义函数体;
{
        char temp;
        strcpy(temp,p1);
        strcpy(p1,p2);
        strcpy(p2,temp);
}

FishC 发表于 昨天 21:24

但求过程001 发表于 2026-03-15 21:23
FishC 发表于 2026-3-15 21:11
不客气!很高兴能帮到 ...

抱歉,我犯了一个严重错误!在修正的代码中,我把 `char str1` 写成了 `char str1`,这导致每个字符串只有一个字符的空间,完全不够用。

修正后的正确代码应该是:


#include <stdio.h>
#include <string.h>

void compare(char *p1, char *p2);// 函数声明

int main()// 使用 int main() 而不是 void main()
{
    char str1, str2, str3;// 分配足够的内存空间

    printf("请输入第一个字符串:");
    scanf("%s", str1);
    printf("请输入第二个字符串:");
    scanf("%s", str2);
    printf("请输入第三个字符串:");
    scanf("%s", str3);

    // 排序逻辑
    if (strcmp(str1, str2) > 0)
    {
      compare(str1, str2);
    }
    if (strcmp(str1, str3) > 0)
    {
      compare(str1, str3);
    }
    if (strcmp(str2, str3) > 0)
    {
      compare(str2, str3);
    }

    printf("排序后的字符串为:\n");
    printf("%s\n%s\n%s\n", str1, str2, str3);

    return 0;
}

void compare(char *p1, char *p2)// 函数定义
{
    char temp;// 临时数组用于交换
    strcpy(temp, p1);
    strcpy(p1, p2);
    strcpy(p2, temp);
}


主要修改:

1. 将 `char str1, str2, str3;` 改为 `char str1, str2, str3;`,为每个字符串分配100个字符的空间。

2. 在 `compare` 函数中,将 `char temp;` 改为 `char temp;`,确保有足够空间存储要交换的字符串。

3. 将 `void main()` 改为 `int main()`,并添加 `return 0;`,这是更标准的写法。

现在程序应该可以正常运行了:会提示输入三个字符串,然后按字典序排序输出。

注意事项:
- 输入每个字符串时不要超过99个字符,否则会发生缓冲区溢出。
- 这个排序算法是正确的,通过三次比较和交换确保三个字符串按顺序排列。

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

但求过程001 发表于 昨天 21:39

FishC 发表于 2026-3-15 21:24
抱歉,我犯了一个严重错误!在修正的代码中,我把 `char str1` 写成了 `char str1`,这导致每个字 ...

你第一次修改的程序就是char str,没错啊,但就是按照这样,运行后也只能输入str1,str2和str3就是输入不了。

FishC 发表于 昨天 21:40

但求过程001 发表于 2026-03-15 21:39
FishC 发表于 2026-3-15 21:24
抱歉,我犯了一个严重 ...

我明白了问题所在!我犯了一个严重的错误:在代码示例中,我把数组的声明写错了。应该是 `char str1` 这样的数组,而不是 `char str1`。

正确的代码应该是这样的:


#include <stdio.h>
#include <string.h>

void compare(char *p1, char *p2);

int main()
{
    char str1, str2, str3;// 正确:使用字符数组
   
    printf("请输入第一个字符串:");
    scanf("%s", str1);
    printf("请输入第二个字符串:");
    scanf("%s", str2);
    printf("请输入第三个字符串:");
    scanf("%s", str3);
   
    // 排序逻辑
    if(strcmp(str1, str2) > 0)
    {
      compare(str1, str2);
    }
    if(strcmp(str1, str3) > 0)
    {
      compare(str1, str3);
    }
    if(strcmp(str2, str3) > 0)
    {
      compare(str2, str3);
    }
   
    printf("排序后的字符串为:\n");
    printf("%s\n%s\n%s\n", str1, str2, str3);
   
    return 0;
}

void compare(char *p1, char *p2)
{
    char temp;// 临时数组也需要足够大
    strcpy(temp, p1);
    strcpy(p1, p2);
    strcpy(p2, temp);
}


关键修改:
1. char str1, str2, str3; 而不是 char str1, str2, str3;
2. char temp; 而不是 char temp;

为什么你之前的程序只能输入 str1?
- 当使用 char str1; 时,你只分配了1个字节的内存
- 当你输入一个字符串时,它会写入超出这个字节的内存,导致程序崩溃或行为异常
- 这就是为什么后续的输入无法正常进行

现在这个版本应该可以正常工作,会提示输入三个字符串,然后按字典序排序输出。

很抱歉我之前给出的代码中有错误,感谢你的耐心!

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