1、我应该认为定义好数组的下标就是整个数组的长度,比如a[1]就代表他就只有一个元素,而不是两个 char name[3];这意味着3个元素
2、用整个直接除以数组的首地址位置就能够得到所有元素个数,当然如果你自己输入的就得不到
strlen(name)/name[0]==》这个得到的是整个数组中所有字符的个数
3、冒泡排序第二个循环是在相邻元素之间进行交换,而不是跟第一个循环牵扯到什么关系
错误示范: store = name[i];
name[k] = name[i];
name[i] = store;
flag =true;
4、这篇文章非常详细的讲述了冒泡排序的推理方法,以及优化方案:【排序算法】史上最通俗易懂的【冒泡排序】详解-CSDN博客
下面这一整块都是错误代码
#include<stdio.h>
#include<string.h>
int main()
{
char name[100];
scanf("%c%c%c",&name[0],&name[1],&name[2]);
for(int i =0;i<strlen(name)/name[0] - 1;i++)
{
bool flag = false;
for(int k = 0;k<strlen(name)/name[0] - i;k++)
{
if(name[i]>name[k])
{
char store;
store = name[i];
name[k] = name[i];
name[i] = store;
flag =true;
}
}
if(flag != true)
{
break;
}
}
for(int i =0;i<strlen(name)/name[0] - 1;i++)
{
printf("%c",name[i]);
}
return 0;
}
还是会输出一堆乱码
正确代码:
#include<stdio.h>
#include<string.h>
int main()
{
char name[3];
scanf("%c%c%c",&name[0],&name[1],&name[2]);
for(int i =0;i<3;i++)
{
bool flag = false;
for(int k = 0;k<3 - i;k++)
{
if(name[k]>name[k+1])
{
char store;
store = name[k];
name[k] = name[k+1];
name[k+1] = store;
flag =true;
}
}
if(flag != true)
{
break;
}
}
for(int i =0;i<3;i++)
{
printf("%c",name[i]);
}
return 0;
}
下面补充我为什么不能通过OJ测试的错误代码和错误原因:
错误原因:
有一些问题会导致在OJ系统中无法通过:
-
数组越界:
name
数组是一个长度为 3 的字符数组,但是在scanf()
中却尝试将整个数组作为参数传递,这会导致数组越界。正确的做法是使用数组的索引,比如&name[0]
、&name[1]
、&name[2]
。 -
错误处理:在使用
scanf()
读取字符后调用了getchar()
来清除输入缓冲区中的换行符。这在大多数情况下是一个合理的做法,但是如果输入中包含多个换行符,则会导致额外的空格输出。 -
循环逻辑问题:代码尝试在一个循环中读取和处理多个输入,但是在循环内部也进行了排序和输出。这会导致在输入完一个单词后就会尝试对其进行排序和输出,而不是等待输入完整的三个单词。《说白了就是我的第二个冒泡排序循环for(int k = 0;k<3 - i;k++)写错了》
-
另外还有一个最后输出结果的换行问题,最好进行一次换行操作
for(int i =0;i<3;i++)
{
printf("%c",name[i]);
if(i != 2)
{
printf(" ");
}
}
printf("\n"); // 输出换行符
}
错误代码:
#include<stdio.h>
#include<stdbool.h>
int main()
{
char name[3];
while(scanf("%c",&name) != EOF)
{
getchar();
for(int i =0;i<3;i++)
{
bool flag = false;
for(int k = 0;k<3 - i;k++)
{
if(name[k]>name[k+1])
{
char store;
store = name[k];
name[k] = name[k+1];
name[k+1] = store;
flag =true;
}
}
if(flag != true)
{
break;
}
}
for(int i =0;i<3;i++)
{
printf("%c",name[i]);
if(i != 2)
{
printf(" ");
}
}
}
return 0;
}
正确的OJ代码:
#include<stdio.h>
#include<stdbool.h>
int main()
{
char name[3];
while(scanf("%c%c%c", &name[0], &name[1], &name[2]) != EOF)
{
getchar();
for(int i =0;i<3;i++)
{
bool flag = false;
for(int k = 0;k<3 - i-1;k++)
{
if(name[k]>name[k+1])
{
char store;
store = name[k];
name[k] = name[k+1];
name[k+1] = store;
flag =true;
}
}
if(flag != true)
{
break;
}
}
for(int i =0;i<3;i++)
{
printf("%c",name[i]);
if(i != 2)
{
printf(" ");
}
}
printf("\n"); // 输出换行符
}
return 0;
}