为什么输入了#后没有结束输入呢?

img

img


要求输入#结束字符数组的输入,用do while这样写为什么行不通啊

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;
}

  • 这篇博客: 【算法总结】快速排序及边界问题分析中的 细节二:使用do-while在判断前先移动指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 考虑一个边界问题,为什么不能让i = lj = r然后使用while循环代替do-while循环?

    探讨一下写成如下形式会有什么问题

    while(q[i] < x) i++;
    while(q[j] > x) j--;
    

    若数组中存在重复的数字,某一轮可能存在**ij都指向重复的数字**,并且分界点x也是这个数字,上述两个while语句的判断就会结束循环,此时q[i] = q[j] = x,交换ij指向这个局面仍然不会改变,因此下一轮会重复这个过程,陷入死循环。

    因此,要确保每轮下来两个指针都至少会移动一步,保证上一次交换的结果不会再次判断。

    思路是,在判断while条件时,先移动指针。用do-while最容易实现这个思想,也可以用while实现:

    do i++; while(q[i] < x);
    do j--; while(q[j] > x);
    //等价于
    while(q[++i] < x);
    while(q[--j] > x);
    

    同时为了保证每轮下来边界lr都能被判断到,因此初始化要i = l - 1, j = r + 1使指针在数组两端之外。