新手求助!各位高手来帮帮忙吧!

时间:2021-12-04 11:23:15
本人刚接触C语言,有很多东西不懂,现在有道题我想了很久,就是没有想出来,希望群里面的高手能帮我解决一下。
题目是这样的:

    了解switch分支结构,输入一个‘0’-‘9’的字符。打印该字符,如果连续输入同一个数字字符,则不打印。除了基本数据类型,不允许使用其他数据类型。如果使用其他数据类型。如果输入非数字字符,则打印错误信息。

下面是我写的代码,但是调试不出来,希望高手们能指出我的错误,或提供一个代码(最好有注释),小弟在此谢谢了!

 

#include "stdio.h"

void main( )
{
char num;
char c;

bool flag=true;
printf("Please input a number:\n");


while(flag)

{
scanf("%c",&num);

switch(num) 
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': printf("%c\n",num );
break;

default: printf("input error!!!\n");
    flag=false;
    break;

}
scanf("%c",&c );

if (c==num)
{
flag=false;
}

else num=c;

}



}

16 个解决方案

#1


基本不现实 啊 每次的话都会输入读取一个字符  

#2


就好比你输入 11 他一定会先读取一个1 然后另外一个1 存储在缓冲区的 可以清楚缓冲区 但是不能解决你要的结果

#3



#include "stdio.h"

void main( )
{
char num;
char c;
bool flag=true;
printf("Please input a number:\n");
scanf("%c",&num);
while(flag)
{

switch(num)  
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': printf("%c\n",num );
break;
default: 
printf("input error!!!\n");
flag=false;
fflush(stdin);
break;
}
scanf("%c",&c );
if (c==num)
{
flag=false;
}
else num=c;
}
}

#4


#include "stdio.h"

void main( ){
char num;
bool flag=true;
while(flag) {
printf("Please input a number: ");
scanf("%c",&num);
switch(num)  {
case '0':
printf("%c\n",num );
break;
case '1':
printf("%c\n",num );
break;
case '2':
printf("%c\n",num );
break;
case '3':
printf("%c\n",num );
break;
case '4':
printf("%c\n",num );
break;
case '5':
printf("%c\n",num );
break;
case '6':
printf("%c\n",num );
break;
case '7':
printf("%c\n",num );
break;
case '8':
printf("%c\n",num );
break;
case '9': printf("%c\n",num );
break;
default: 
printf("input error!!!\n");
flag=false;
break;
}
getchar();
}
}
//能行不?

#5


引用 3 楼 hnuqinhuan 的回复:
C/C++ code

#include "stdio.h"

void main( )
{
    char num;
    char c;
    bool flag=true;
    printf("Please input a number:\n");    
    scanf("%c",&num);
    while(flag)
    {
  ……


这个代码还是运行不了啊,还有“fflush(stdin);”这个是什么意思啊?

#6


引用 4 楼 ganpengjin1 的回复:
#include "stdio.h"

void main( ){
char num;
bool flag=true;
while(flag) {
printf("Please input a number: ");
scanf("%c",&num);
switch(num) {
case '0':
printf("%c\n",num );
break;
case ……


这个也还是不行,就是第一次输入2,输出2,第二次再输入2,应该停止打印。但是这个代码打印不了!不过谢谢你提供的代码啊!

#7


绿色的那个可以的,不知道你什么编译器,fflush(stdin)就是清空缓冲,把该输出的都强制输出

#8



#include "stdio.h"

int main(void )
{
char num;
char c;

bool flag=true;
printf("Please input a number:\n");


while(flag)

{
fflush(stdin);
scanf("%c",&num);
if( c == num) continue;
switch(num)  
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': printf("%c\n",num );
break;

default: printf("input error!!!\n");
flag=false;
break;

}
c=num;

}
return 0;
}



没太明白意思,看看这个行不。

#9


别搞的太复杂了,fflush(stdin),弄得跟C++一样,C标准里对输入缓冲区的刷新是没有定义的。
不用char,用int吧

#10


引用 9 楼 vegertar 的回复:
别搞的太复杂了,fflush(stdin),弄得跟C++一样,C标准里对输入缓冲区的刷新是没有定义的。
不用char,用int吧
这就C语言里的清除掉输入栈中的数据,没错,也不是C++中的,就存放在stdio.h中

#11


引用 10 楼 ganpengjin1 的回复:
引用 9 楼 vegertar 的回复:
别搞的太复杂了,fflush(stdin),弄得跟C++一样,C标准里对输入缓冲区的刷新是没有定义的。
不用char,用int吧
这就C语言里的清除掉输入栈中的数据,没错,也不是C++中的,就存放在stdio.h中

唔,C++里对输入流的刷新是合法的,所以有cin.sync()的用法,我不知道大家对fflush(stdin)是否来自于C++的习惯,但是
int fflush(FILE* stream);
    Flushes stream stream and returns zero on success or EOF on error.  Effect undefined for input stream. fflush(NULL) flushes all output streams.
当然,有些实现,比如gcc,它有自己的扩展,能够实现刷新输入流的功能。

#12


引用 9 楼 vegertar 的回复:
别搞的太复杂了,fflush(stdin),弄得跟C++一样,C标准里对输入缓冲区的刷新是没有定义的。
不用char,用int吧


呵呵,bool 这个的确是c++里面的声明符。而fflush(stdin)我在标准c编译器的确可以编译通过。

#13


引用 11 楼 vegertar 的回复:
引用 10 楼 ganpengjin1 的回复:

引用 9 楼 vegertar 的回复:
别搞的太复杂了,fflush(stdin),弄得跟C++一样,C标准里对输入缓冲区的刷新是没有定义的。
不用char,用int吧
这就C语言里的清除掉输入栈中的数据,没错,也不是C++中的,就存放在stdio.h中

唔,C++里对输入流的刷新是合法的,所以有cin.sync()的用法,我不……
 嗯,是这样的。

#14


引用 8 楼 niuchengshi 的回复:
C/C++ code

#include "stdio.h"

int main(void )
{
char num;
char c;

bool flag=true;
printf("Please input a number:\n");


while(flag)

{
fflush(stdin);
scanf("%c",&num);
if( c =……

谢谢,这个很接近了。这个问题的意思是:输入的必须是数字,并且直接打印出来,如果不是数字则显示错误。还有如果这次输入和上次输入的一样,那么就停止打印,并结束运行。例如:如果输入2,则打印2,如果下一次又输入2,则不打印,并结束运行;输入“A”则打印错误信息结束运行。  我用的是microsoft visual c++6.0 编译器的。

#15


把continue 改成break;

#16


引用 15 楼 niuchengshi 的回复:
把continue 改成break;

终于成功了,非常的感谢啊!

#1


基本不现实 啊 每次的话都会输入读取一个字符  

#2


就好比你输入 11 他一定会先读取一个1 然后另外一个1 存储在缓冲区的 可以清楚缓冲区 但是不能解决你要的结果

#3



#include "stdio.h"

void main( )
{
char num;
char c;
bool flag=true;
printf("Please input a number:\n");
scanf("%c",&num);
while(flag)
{

switch(num)  
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': printf("%c\n",num );
break;
default: 
printf("input error!!!\n");
flag=false;
fflush(stdin);
break;
}
scanf("%c",&c );
if (c==num)
{
flag=false;
}
else num=c;
}
}

#4


#include "stdio.h"

void main( ){
char num;
bool flag=true;
while(flag) {
printf("Please input a number: ");
scanf("%c",&num);
switch(num)  {
case '0':
printf("%c\n",num );
break;
case '1':
printf("%c\n",num );
break;
case '2':
printf("%c\n",num );
break;
case '3':
printf("%c\n",num );
break;
case '4':
printf("%c\n",num );
break;
case '5':
printf("%c\n",num );
break;
case '6':
printf("%c\n",num );
break;
case '7':
printf("%c\n",num );
break;
case '8':
printf("%c\n",num );
break;
case '9': printf("%c\n",num );
break;
default: 
printf("input error!!!\n");
flag=false;
break;
}
getchar();
}
}
//能行不?

#5


引用 3 楼 hnuqinhuan 的回复:
C/C++ code

#include "stdio.h"

void main( )
{
    char num;
    char c;
    bool flag=true;
    printf("Please input a number:\n");    
    scanf("%c",&num);
    while(flag)
    {
  ……


这个代码还是运行不了啊,还有“fflush(stdin);”这个是什么意思啊?

#6


引用 4 楼 ganpengjin1 的回复:
#include "stdio.h"

void main( ){
char num;
bool flag=true;
while(flag) {
printf("Please input a number: ");
scanf("%c",&num);
switch(num) {
case '0':
printf("%c\n",num );
break;
case ……


这个也还是不行,就是第一次输入2,输出2,第二次再输入2,应该停止打印。但是这个代码打印不了!不过谢谢你提供的代码啊!

#7


绿色的那个可以的,不知道你什么编译器,fflush(stdin)就是清空缓冲,把该输出的都强制输出

#8



#include "stdio.h"

int main(void )
{
char num;
char c;

bool flag=true;
printf("Please input a number:\n");


while(flag)

{
fflush(stdin);
scanf("%c",&num);
if( c == num) continue;
switch(num)  
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': printf("%c\n",num );
break;

default: printf("input error!!!\n");
flag=false;
break;

}
c=num;

}
return 0;
}



没太明白意思,看看这个行不。

#9


别搞的太复杂了,fflush(stdin),弄得跟C++一样,C标准里对输入缓冲区的刷新是没有定义的。
不用char,用int吧

#10


引用 9 楼 vegertar 的回复:
别搞的太复杂了,fflush(stdin),弄得跟C++一样,C标准里对输入缓冲区的刷新是没有定义的。
不用char,用int吧
这就C语言里的清除掉输入栈中的数据,没错,也不是C++中的,就存放在stdio.h中

#11


引用 10 楼 ganpengjin1 的回复:
引用 9 楼 vegertar 的回复:
别搞的太复杂了,fflush(stdin),弄得跟C++一样,C标准里对输入缓冲区的刷新是没有定义的。
不用char,用int吧
这就C语言里的清除掉输入栈中的数据,没错,也不是C++中的,就存放在stdio.h中

唔,C++里对输入流的刷新是合法的,所以有cin.sync()的用法,我不知道大家对fflush(stdin)是否来自于C++的习惯,但是
int fflush(FILE* stream);
    Flushes stream stream and returns zero on success or EOF on error.  Effect undefined for input stream. fflush(NULL) flushes all output streams.
当然,有些实现,比如gcc,它有自己的扩展,能够实现刷新输入流的功能。

#12


引用 9 楼 vegertar 的回复:
别搞的太复杂了,fflush(stdin),弄得跟C++一样,C标准里对输入缓冲区的刷新是没有定义的。
不用char,用int吧


呵呵,bool 这个的确是c++里面的声明符。而fflush(stdin)我在标准c编译器的确可以编译通过。

#13


引用 11 楼 vegertar 的回复:
引用 10 楼 ganpengjin1 的回复:

引用 9 楼 vegertar 的回复:
别搞的太复杂了,fflush(stdin),弄得跟C++一样,C标准里对输入缓冲区的刷新是没有定义的。
不用char,用int吧
这就C语言里的清除掉输入栈中的数据,没错,也不是C++中的,就存放在stdio.h中

唔,C++里对输入流的刷新是合法的,所以有cin.sync()的用法,我不……
 嗯,是这样的。

#14


引用 8 楼 niuchengshi 的回复:
C/C++ code

#include "stdio.h"

int main(void )
{
char num;
char c;

bool flag=true;
printf("Please input a number:\n");


while(flag)

{
fflush(stdin);
scanf("%c",&num);
if( c =……

谢谢,这个很接近了。这个问题的意思是:输入的必须是数字,并且直接打印出来,如果不是数字则显示错误。还有如果这次输入和上次输入的一样,那么就停止打印,并结束运行。例如:如果输入2,则打印2,如果下一次又输入2,则不打印,并结束运行;输入“A”则打印错误信息结束运行。  我用的是microsoft visual c++6.0 编译器的。

#15


把continue 改成break;

#16


引用 15 楼 niuchengshi 的回复:
把continue 改成break;

终于成功了,非常的感谢啊!