求助
#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没有提示输入,不知道程序哪里有问题~~ 你的程序有几个关键问题,导致运行时只能输入第一个字符串。主要原因是未给字符串指针分配内存,以及 `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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-3-15 21:02
你的程序有几个关键问题,导致运行时只能输入第一个字符串。主要原因是未给字符串指针分配内存,以及 `comp ...
明白~~感谢~~ 但求过程001 发表于 2026-03-15 21:11
FishC 发表于 2026-3-15 21:02
你的程序有几个关键问 ...
不客气!很高兴能帮到你。如果还有其他问题,随时来问~祝你学习顺利!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 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);
} 但求过程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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-3-15 21:24
抱歉,我犯了一个严重错误!在修正的代码中,我把 `char str1` 写成了 `char str1`,这导致每个字 ...
你第一次修改的程序就是char str,没错啊,但就是按照这样,运行后也只能输入str1,str2和str3就是输入不了。 但求过程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]