Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中执行while循环_C_Loops_Do While - Fatal编程技术网

在C中执行while循环

在C中执行while循环,c,loops,do-while,C,Loops,Do While,我正在使用数组实现一个多项式。以下是问题陈述: 编写一个菜单驱动程序,使用数组将多项式表示为数据结构。编写两个多项式的加、减、乘函数;将一个多项式与一个常数相乘,找出一个多项式是否为“零多项式”,返回多项式的次数。假设每次操作后都会创建一个新的多项式。如何输入和输出多项式 我已经创建了输入和输出函数。但是我的do while循环运行了两次。请帮助我找出原因 do-while循环 } 打印菜单()功能 create_poly()函数 以下是一个示例输出: 1. Create a new polyn

我正在使用数组实现一个多项式。以下是问题陈述:

编写一个菜单驱动程序,使用数组将多项式表示为数据结构。编写两个多项式的加、减、乘函数;将一个多项式与一个常数相乘,找出一个多项式是否为“零多项式”,返回多项式的次数。假设每次操作后都会创建一个新的多项式。如何输入和输出多项式

我已经创建了输入和输出函数。但是我的do while循环运行了两次。请帮助我找出原因

do-while循环 }

打印菜单()
功能
create_poly()
函数 以下是一个示例输出:

1. Create a new polynomial. 2. Print polynomial. q. Exit Enter Choice:1 ch = 1 Enter size of the polynomial:2 Enter terms of the polynomial(coeff then exponent): 2 4 6 7 1. Create a new polynomial. 2. Print polynomial. q. Exit Enter Choice: ch = Invalid choice. 1. Create a new polynomial. 2. Print polynomial. q. Exit Enter Choice:q ch = q 1.创建一个新的多项式。 2.打印多项式。 q、 出口 输入选项:1 ch=1 输入多项式的大小:2 输入多项式的项(系数然后指数): 2 4 6 7 1.创建一个新的多项式。 2.打印多项式。 q、 出口 输入选项: ch= 无效的选择。 1.创建一个新的多项式。 2.打印多项式。 q、 出口 输入选项:q ch=q 尝试刷新
stdin
…问题仍然存在。在每个步骤中打印
ch
的值,我认为这是一个空白。空白从何而来



答案也回答了这个问题。

在您做出初始选择后,还有一个额外的字符等待使用,这就是循环执行两次的原因


请参见comp.lang.c常见问题解答中的n,如果您测试下一个代码,您将注意到相同的问题

int main() {
    char c;

    do {
        scanf_s("%c", &c);
        if (c != 'q')
             printf("test scanf() function\n");

    } while (c);
}
当按下enter键时,scanf()函数起作用,但这会在缓冲区输入中插入另一个字符,即新行“\n”的字符,由于循环阻塞,scanf()会再次获取该字符。请尝试使用此代码更改以前的代码:`

do {
    scanf_s("%c", &c); // or c = getchar();
    switch (c){
    case '\n':
        break;
    default:
        printf("test scanf() function\n");
    }

} while (c);`
并且可以正常工作。在代码中,仅在开关块中添加一个新的大小写:

 switch(ch) {
    case '1':
        create_poly(poly,termpool,&next_poly);
        break;
    case '2':
        print_poly(poly,termpool,&next_poly);
        break;

    case '\n':
        break;

    case 'q':
        break;
    default:
        printf("Invalid choice.");
 }

抱歉,英语不是我的母语

您应该阅读您正在使用的每个函数的文档,尤其是。您应该测试
scanf
的结果。您应该使用所有警告和调试信息(
gcc-Wall-Wextra-g
)进行编译。您应该学习如何使用调试器(
gdb
)。此外,请编辑您的问题以改进它。它缺少一个
Linux
标记!请将
\n
放在格式字符串的末尾,而不是开头。另请参见@BasileStarynkevitch:我不同意标记建议。如果它应该是可移植的(没有指示它不应该是可移植的),linux标记可能是错误的。顺便说一句,我想您会发现信息丰富。这一行:scanf(“%d”,&pos);有两个问题1)需要检查scanf()的返回值,以确保目标参数是实际输入/设置的。2)scanf()在格式参数中没有特定编码的情况下不会占用空白。建议格式参数为:%d“因此将使用前导空格,包括未测试scanf返回值的任何换行符始终是一个错误。 1. Create a new polynomial. 2. Print polynomial. q. Exit Enter Choice:1 ch = 1 Enter size of the polynomial:2 Enter terms of the polynomial(coeff then exponent): 2 4 6 7 1. Create a new polynomial. 2. Print polynomial. q. Exit Enter Choice: ch = Invalid choice. 1. Create a new polynomial. 2. Print polynomial. q. Exit Enter Choice:q ch = q
int main() {
    char c;

    do {
        scanf_s("%c", &c);
        if (c != 'q')
             printf("test scanf() function\n");

    } while (c);
}
do {
    scanf_s("%c", &c); // or c = getchar();
    switch (c){
    case '\n':
        break;
    default:
        printf("test scanf() function\n");
    }

} while (c);`
 switch(ch) {
    case '1':
        create_poly(poly,termpool,&next_poly);
        break;
    case '2':
        print_poly(poly,termpool,&next_poly);
        break;

    case '\n':
        break;

    case 'q':
        break;
    default:
        printf("Invalid choice.");
 }