if(ch=='o')
你输入的字符串放到a[i],但接着i++了啊,while检查的a[i],不是写入字符串的a[i]了啊,i值改变了
改为:
i=-1;
do
{
i++;
printf(".....");
scanf_s("%s",a[i],20);
}while(i<9 && a[i][0] != '#');
这么改,供参考:
#include <stdio.h>
int main()
{
char a[100];
int i = -1;
printf("please enter the data,if you want to end the input process,please input #:");
do {
i++;
} while ((a[i] = getchar()) != '#');
a[i] = '\0';
printf("%s", a);
return 0;
}
考虑一个边界问题,为什么不能让i = l
和j = r
然后使用while循环代替do-while循环?
探讨一下写成如下形式会有什么问题
while(q[i] < x) i++;
while(q[j] > x) j--;
若数组中存在重复的数字,某一轮可能存在**i
和j
都指向重复的数字**,并且分界点x
也是这个数字,上述两个while语句的判断就会结束循环,此时q[i] = q[j] = x
,交换i
和j
指向这个局面仍然不会改变,因此下一轮会重复这个过程,陷入死循环。
因此,要确保每轮下来两个指针都至少会移动一步,保证上一次交换的结果不会再次判断。
思路是,在判断while条件时,先移动指针。用do-while
最容易实现这个思想,也可以用while
实现:
do i++; while(q[i] < x);
do j--; while(q[j] > x);
//等价于
while(q[++i] < x);
while(q[--j] > x);
同时为了保证每轮下来边界l
和r
都能被判断到,因此初始化要i = l - 1, j = r + 1
使指针在数组两端之外。