user-0 提问: C语言如何限制输入长度？（Win10下的GetConsoleInput()）

回复:
user: user-1
content: 引用 29 楼 czxinc 的回复:[quote=引用 27 楼 zhao4zhong1 的回复:] 建议先弄清楚啥叫字符。 对于字符我是一知半解的状态。[/quote] 如果你以前没见过#21楼的字符的话。

user: user-0
content: 引用 27 楼 zhao4zhong1 的回复:建议先弄清楚啥叫字符。 对于字符我是一知半解的状态。

user: user-0
content: 引用 19 楼 user-4 的回复:# include <stdio.h>//int char 输入容易出问题 下面的代码可以解决这个问题 # include <conio.h> # define Limit 40000000 # define N 10  //如果要录入X个字节则 N=X int  get_GBK(char *A,int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度 int main() {     char A[N+1];     while(1)     {         printf("输入:");         get_GBK(A,2,N);         puts(A);     }     return 0; } int  get_GBK(char *A,int min,int max) {     int B,C,D;     do             {                 for(B=max+printf("["),C=1; C<B; C++)printf(" ");                 printf("]\b");                 while(--B)printf("\b");                 while((C=getch())!='\r')if(C>127||C==8)                     {                         if(C!=8&&B<max&&printf("%c",C))A[B++]=C;                         else if(C==8&&B>0)                         {                            printf("\b \b");                             if(B&1)                             {                                 B--;                                 if(B)printf("\b \b");                                 else printf("[ ");                             }                             else  B-=2;                             printf("\b");                         }                         else if(B>=max)                         {                             D=printf("]  长度:[%d,%d]!",min,max);                             for(C=0; C<Limit; C++);                             while(--D)printf("\b \b");                             printf("\b");                         }                     }                 A[B]=0;                 if(B<min)                 {                     for(C=B; C<max; C++)printf(" ");                     D=max+printf("]  长度:[%d,%d]!",min,max);                     for(C=0; C<Limit; C++);                     while(D--)printf("\b \b");                     printf("\b");                 }             }while(B<min);     printf("\n");     return B; }  这个不行吗？ 这个可以，但是在win10下有点儿问题，我试试看能不能解决。

user: user-1
content: 建议先弄清楚啥叫字符。

user: user-1
content: 输入校验永远做不到完美； 所以程序员永远不会失业。

user: user-1
content: 水很深！  参考下面：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> extern "C" HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     wchar_t wc[2];      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(48,0,0,0,0,0,0,0,GB2312_CHARSET ,0,0,0,0,"宋体-方正超大字符集");     SelectObject(hdc,hfont);     wc[0]=0xD854u;     wc[1]=0xDC00u;     TextOutW(hdc,10,10,wc,2);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; } #if 0 代理项或代理项对是一对共同表示单个字符的 16 位 Unicode 编码值。需要记住的关键一点是： 代理项对实际上是 32 位单个字符，不能再假定一个 16 位 Unicode 编码值正好映射到一个字符。  使用代理项对 代理项对的第一个值是高代理项，包含介于 U+D800 到 U+DBFF 范围内的 16 位代码值。 该对的第二个值是低代理项，包含介于 U+DC00 到 U+DFFF 范围内的值。通过使用代理项对， 16 位 Unicode 编码系统可以对已由 Unicode 标准定义的一百多万个其他字符 (220) 进行寻址。  在传递给 XmlTextWriter 方法的任何字符串中都可以使用代理项字符。不过，代理项字符在编写的 XML 中应该有效。例如，万维网联合会 (W3C) 建议不允许在元素或属性的名称中使用代理项字符。 如果字符串包含无效的代理项对，则引发异常。  另外，可以使用 WriteSurrogateCharEntity 写出与代理项对相对应的字符实体。字符实体以十六 进制格式写出，并用以下公式生成：  (highChar -0xD800) * 0x400 + (lowChar -0xDC00) + 0x10000  如果字符串包含无效的代理项对，则引发异常。下面的示例显示将代理项对作为输入的 WriteSurrogateCharEntity 方法。  C#复制  // The following line writes 𐀀. WriteSurrogateCharEntity ('\uDC00', '\uD800'); 下面的示例生成一个代理项对文件，将其加载到 XmlReader 中，并用新的文件名保存文件。 然后，原始文件和新文件被加载回应用程序的 XML 文档对象模型 (DOM) 结构中以进行比较。  C#复制  char lowChar, highChar; char [] charArray = new char[10]; FileStream targetFile = new FileStream("SurrogatePair.xml",       FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);  lowChar = Convert.ToChar(0xDC00); highChar = Convert.ToChar(0xD800); XmlTextWriter tw = new XmlTextWriter(targetFile, null); tw.Formatting = Formatting.Indented; tw.WriteStartElement("root"); tw.WriteStartAttribute("test", null); tw.WriteSurrogateCharEntity(lowChar, highChar); lowChar = Convert.ToChar(0xDC01); highChar = Convert.ToChar(0xD801); tw.WriteSurrogateCharEntity(lowChar, highChar); lowChar = Convert.ToChar(0xDFFF); highChar = Convert.ToChar(0xDBFF); tw.WriteSurrogateCharEntity(lowChar, highChar);  // Add 10 random surrogate pairs. // As Unicode, the high bytes are in lower // memory; for example, word 6A21 as 21 6A. // The high or low is in the logical sense. Random random = new Random(); for (int i = 0; i < 10; ++i) {       lowChar = Convert.ToChar(random.Next(0xDC00, 0xE000));       highChar = Convert.ToChar(random.Next(0xD800, 0xDC00));       charArray[i] = highChar;       charArray[++i] = lowChar; } tw.WriteChars(charArray, 0, charArray.Length);  for (int i = 0; i < 10; ++i) {       lowChar = Convert.ToChar(random.Next(0xDC00, 0xE000));       highChar = Convert.ToChar(random.Next(0xD800, 0xDC00));       tw.WriteSurrogateCharEntity(lowChar, highChar); }  tw.WriteEndAttribute(); tw.WriteEndElement(); tw.Flush(); tw.Close();  XmlTextReader r = new XmlTextReader("SurrogatePair.xml");  r.Read(); r.MoveToFirstAttribute(); targetFile = new FileStream("SurrogatePairFromReader.xml",        FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);  tw = new XmlTextWriter(targetFile, null); tw.Formatting = Formatting.Indented; tw.WriteStartElement("root"); tw.WriteStartAttribute("test", null); tw.WriteString(r.Value); tw.WriteEndAttribute(); tw.WriteEndElement(); tw.Flush(); tw.Close();  // Load both result files into the DOM and compare. XmlDocument doc1 = new XmlDocument(); XmlDocument doc2 = new XmlDocument(); doc1.Load("SurrogatePair.xml"); doc2.Load("SurrogatePairFromReader.xml"); if (doc1.InnerXml != doc2.InnerXml) {       Console.WriteLine("Surrogate Pair test case failed"); } 在使用 WriteChars 方法（一次写出一个缓冲区的数据）写出时，输入中的代理项对可能 会在一个缓冲区内被意外拆分。由于代理项值是定义完善的，如果 WriteChars 遇到来自 较低范围或者较高范围的 Unicode 值，它将该值标识为代理项对的一半。当遇到  WriteChars 将导致从拆分代理项对的缓冲区写入的情况时，将引发异常。使用   IsHighSurrogate 方法检查缓冲区是否以高代理项字符结束。如果缓冲区中的最后一个   字符不是高代理项，可以将该缓冲区传递给 WriteChars 方法。  请参见 概念 使用 XmlTextWriter 创建格式正确的 XML XmlTextWriter 的 XML 输出格式设置 XmlTextWriter 的命名空间功能  #endif

user: user-1
content: 禁止输入和输入后截短，没什么本质区别。

user: user-2

user: user-0
content: 引用 24 楼 zyx6680599 的回复:[quote=引用 22 楼 zhao4zhong1 的回复:] 输入校验永远做不到完美； 所以程序员永远不会失业。 引用 17 楼 czxinc 的回复:[quote=引用 6 楼 user-4 的回复:] https://blog.csdn.net/user-4/article/details/77422530 我的这个博客里的第一个代码片中的Getchar函数～和你想过一样的问题～希望能帮到你这个函数改了一年～ 我复制了你的代码尝试了一下，发现了一个问题。 我其实是想用户在屏幕上输入指定数量的字符，如果超过则禁止输入。但是你的这两个例子都是判断输入过多后裁剪字符的呢。[/quote] 其实用uchar.h后用getch()就可以了[/quote] vc++6.0没有uchar.h呢

user: user-1
content: getch()能输入运行#21楼代码显示的那个字吗？

user: user-3
content: 引用 22 楼 zhao4zhong1 的回复:输入校验永远做不到完美； 所以程序员永远不会失业。 引用 17 楼 czxinc 的回复:[quote=引用 6 楼 user-4 的回复:] https://blog.csdn.net/user-4/article/details/77422530 我的这个博客里的第一个代码片中的Getchar函数～和你想过一样的问题～希望能帮到你这个函数改了一年～ 我复制了你的代码尝试了一下，发现了一个问题。 我其实是想用户在屏幕上输入指定数量的字符，如果超过则禁止输入。但是你的这两个例子都是判断输入过多后裁剪字符的呢。[/quote] 其实用uchar.h后用getch()就可以了

user: user-4
content: # include <stdio.h>//int char 输入容易出问题 下面的代码可以解决这个问题 # include <conio.h> # define Limit 40000000 # define N 10  //如果要录入X个字节则 N=X int  get_GBK(char *A,int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度 int main() {     char A[N+1];     while(1)     {         printf("输入:");         get_GBK(A,2,N);         puts(A);     }     return 0; } int  get_GBK(char *A,int min,int max) {     int B,C,D;     do             {                 for(B=max+printf("["),C=1; C<B; C++)printf(" ");                 printf("]\b");                 while(--B)printf("\b");                 while((C=getch())!='\r')if(C>127||C==8)                     {                         if(C!=8&&B<max&&printf("%c",C))A[B++]=C;                         else if(C==8&&B>0)                         {                            printf("\b \b");                             if(B&1)                             {                                 B--;                                 if(B)printf("\b \b");                                 else printf("[ ");                             }                             else  B-=2;                             printf("\b");                         }                         else if(B>=max)                         {                             D=printf("]  长度:[%d,%d]!",min,max);                             for(C=0; C<Limit; C++);                             while(--D)printf("\b \b");                             printf("\b");                         }                     }                 A[B]=0;                 if(B<min)                 {                     for(C=B; C<max; C++)printf(" ");                     D=max+printf("]  长度:[%d,%d]!",min,max);                     for(C=0; C<Limit; C++);                     while(D--)printf("\b \b");                     printf("\b");                 }             }while(B<min);     printf("\n");     return B; }  这个不行吗？

user: user-1
content: //GBK汉字内码范围（不包括A1xx～A9xx的标点符号英文字母特殊符号等）    //区码  ,位码    //81-A0 ,40-7E 80-FE    //AA-AF ,40-7E 80-A0    //B0-D6 ,40-7E 80-FE    //D7    ,40-7E 80-F9    //D8-F7 ,40-7E 80-FE    //F8-FE ,40-7E 80-A0

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:wchar_t *fgetws( wchar_t *string, int n, FILE *stream );  wchar_t buf[4]; fgetws(buf,4,stdin); 就算这样，还是达不到要求“用户在屏幕上输入指定数量的字符，如果超过则禁止输入”。

user: user-0
content: 引用 6 楼 user-4 的回复:https://blog.csdn.net/user-4/article/details/77422530 我的这个博客里的第一个代码片中的Getchar函数～和你想过一样的问题～希望能帮到你这个函数改了一年～ 我复制了你的代码尝试了一下，发现了一个问题。 我其实是想用户在屏幕上输入指定数量的字符，如果超过则禁止输入。但是你的这两个例子都是判断输入过多后裁剪字符的呢。

user: user-0
content: 引用 15 楼 zyx6680599 的回复:[quote=引用 11 楼 czxinc 的回复:] [quote=引用 8 楼 zyx6680599 的回复:] [quote=引用 7 楼 user-4 的回复:] # include <stdio.h>//int char 输入容易出问题 下面的代码可以解决这个问题 # define N 10  //如果要录入X个字节则 N=X int Getchar(char A[],int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度 int gainint(int *p,int a,int b); int main(){ 	char A[N+1];//最后一位存'\0' 	int B; 	printf("输入字符串:1--1字节");     Getchar(A,1,1);      printf("输入字符串:0--%d字节",N);     Getchar(A,0,N);//因为min=0  这个时候直接输入回车 结束录入 字符串为空字符串 	 printf("输入字符串:1--%d字节",N);     Getchar(A,1,N);//因为min=1  这个时候直接输入回车 是不会结束录入的 	printf("输入B 1----100："); 	gainint(&B,1,100);     printf("输入B 2----4："); 	gainint(&B,2,4);     return 0; } int gainint(int *p,int a,int b)//输入int *p直至满足(a,b)输入结束，并返回*p的位数       {            do{               *p=a-1;    //此处是为了减少意外情况的发生 虽然那种意外情况不常见         scanf("%d",p);               while(getchar()!='\n');               if(*p>b||*p<a)                   printf("输入有误,请重新输入(%d--%d):\n",a,b);           }while(*p>b||*p<a);           return *p;       }       int Getchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度     {         int B,C;//B保存A的长度 C记录缓冲区的字符串         do{             B=-1;  C=0; //每次用户输入错误而循环时 都要初始化             fgets(A,max+1,stdin);//从键盘录入字符             while(A[++B]);  //求A的字符串长度             if(A[B-1]!='\n') while(getchar()!='\n') C++;    //如果缓冲区里读入的不是\n则记录字符串数量             else  A[--B]='\0'; //☆  去掉\n 并且字符串长度-1             if(C||B&&B<min) //如果缓冲区有字符串或者长度不够 则提示错误   但如果用户只输入回车而且min!=0则不提示错误 但还要输入当前字符串               printf("您输入的字符串长度:%d字节\n请重新输入!\n注:只输入(%d--%d)个字节!\n",B+C,min,max);         }while(C||B<min);         return B;//返回B 即:A字符串的长度     }       # include <stdio.h>//int char 输入容易出问题 下面的代码可以解决这个问题   # define N 10  //如果要录入X个字节则 N=X   int Getchar(char A[],int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度   int gainint(int *p,int a,int b);   int main(){       char A[N+1];//最后一位存'\0'       int L,min,max;       do{     printf("请输入字符串的长度的最小值[0,%d]：",N);     gainint(&min,0,N);     printf("请输入字符串的长度的最大值[%d,%d]：",min,N);     gainint(&max,min,N);     printf("请输入字符串[%d,%d]:",min,max);     Getchar(A,min,max);     printf("字符串：%s\n",A);     }while(1);     return 0;   }   int gainint(int *p,int a,int b)//输入int *p直至满足(a,b)输入结束，并返回*p的位数         {              do{                 *p=a-1;    //此处是为了减少意外情况的发生 虽然那种意外情况不常见           scanf("%d",p);                 while(getchar()!='\n');                 if(*p>b||*p<a)                     printf("输入有误,请重新输入[%d--%d]:",a,b);             }while(*p>b||*p<a);             return *p;         } int Getchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度       {           int B,C;      do{               A[max]=B=C=0;           while((A[B++]=getchar())!='\n'&&B<max);           if(A[B-1]!='\n')while(getchar()!='\n'&&++C);               else A[--B]=0;        if(C||B&&B<min)          printf("您录入的字符串长度:%d字节\n只录入(%d--%d)个字节!\n",B+C,min,max);           }while(C||B<min);           return B;     }  这两个Getchar 你看哪好点你用哪个 希望能帮到你 其实用几个getch()输入不同的变量，用一个数组存储就行了虚假生conio.h[/quote] 抱歉前几天比较忙没有仔细看。 我复制了你的代码尝试了一下，发现了一个问题。 我其实是想用户在屏幕上输入指定数量的字符，如果超过则禁止输入。但是你的这两个例子都是判断输入过多后裁剪字符的呢。[/quote] getch()只能一次键入一个变量，你是不是看我上面的代码了，最底下的是我的，上面的是@赵四老师的[/quote] 十分抱歉，本来是想回复#6\#7的user-4 网友的，不小心回复错了。 getch()只能接受ascii码。而我是想要可以同时输入汉字和英文的函数，getch()就无法接收汉字的unicode码。

user: user-3
content: 引用 11 楼 czxinc 的回复:[quote=引用 8 楼 zyx6680599 的回复:] [quote=引用 7 楼 user-4 的回复:] # include <stdio.h>//int char 输入容易出问题 下面的代码可以解决这个问题 # define N 10  //如果要录入X个字节则 N=X int Getchar(char A[],int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度 int gainint(int *p,int a,int b); int main(){ 	char A[N+1];//最后一位存'\0' 	int B; 	printf("输入字符串:1--1字节");     Getchar(A,1,1);      printf("输入字符串:0--%d字节",N);     Getchar(A,0,N);//因为min=0  这个时候直接输入回车 结束录入 字符串为空字符串 	 printf("输入字符串:1--%d字节",N);     Getchar(A,1,N);//因为min=1  这个时候直接输入回车 是不会结束录入的 	printf("输入B 1----100："); 	gainint(&B,1,100);     printf("输入B 2----4："); 	gainint(&B,2,4);     return 0; } int gainint(int *p,int a,int b)//输入int *p直至满足(a,b)输入结束，并返回*p的位数       {            do{               *p=a-1;    //此处是为了减少意外情况的发生 虽然那种意外情况不常见         scanf("%d",p);               while(getchar()!='\n');               if(*p>b||*p<a)                   printf("输入有误,请重新输入(%d--%d):\n",a,b);           }while(*p>b||*p<a);           return *p;       }       int Getchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度     {         int B,C;//B保存A的长度 C记录缓冲区的字符串         do{             B=-1;  C=0; //每次用户输入错误而循环时 都要初始化             fgets(A,max+1,stdin);//从键盘录入字符             while(A[++B]);  //求A的字符串长度             if(A[B-1]!='\n') while(getchar()!='\n') C++;    //如果缓冲区里读入的不是\n则记录字符串数量             else  A[--B]='\0'; //☆  去掉\n 并且字符串长度-1             if(C||B&&B<min) //如果缓冲区有字符串或者长度不够 则提示错误   但如果用户只输入回车而且min!=0则不提示错误 但还要输入当前字符串               printf("您输入的字符串长度:%d字节\n请重新输入!\n注:只输入(%d--%d)个字节!\n",B+C,min,max);         }while(C||B<min);         return B;//返回B 即:A字符串的长度     }       # include <stdio.h>//int char 输入容易出问题 下面的代码可以解决这个问题   # define N 10  //如果要录入X个字节则 N=X   int Getchar(char A[],int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度   int gainint(int *p,int a,int b);   int main(){       char A[N+1];//最后一位存'\0'       int L,min,max;       do{     printf("请输入字符串的长度的最小值[0,%d]：",N);     gainint(&min,0,N);     printf("请输入字符串的长度的最大值[%d,%d]：",min,N);     gainint(&max,min,N);     printf("请输入字符串[%d,%d]:",min,max);     Getchar(A,min,max);     printf("字符串：%s\n",A);     }while(1);     return 0;   }   int gainint(int *p,int a,int b)//输入int *p直至满足(a,b)输入结束，并返回*p的位数         {              do{                 *p=a-1;    //此处是为了减少意外情况的发生 虽然那种意外情况不常见           scanf("%d",p);                 while(getchar()!='\n');                 if(*p>b||*p<a)                     printf("输入有误,请重新输入[%d--%d]:",a,b);             }while(*p>b||*p<a);             return *p;         } int Getchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度       {           int B,C;      do{               A[max]=B=C=0;           while((A[B++]=getchar())!='\n'&&B<max);           if(A[B-1]!='\n')while(getchar()!='\n'&&++C);               else A[--B]=0;        if(C||B&&B<min)          printf("您录入的字符串长度:%d字节\n只录入(%d--%d)个字节!\n",B+C,min,max);           }while(C||B<min);           return B;     }  这两个Getchar 你看哪好点你用哪个 希望能帮到你 其实用几个getch()输入不同的变量，用一个数组存储就行了虚假生conio.h[/quote] 抱歉前几天比较忙没有仔细看。 我复制了你的代码尝试了一下，发现了一个问题。 我其实是想用户在屏幕上输入指定数量的字符，如果超过则禁止输入。但是你的这两个例子都是判断输入过多后裁剪字符的呢。[/quote] getch()只能一次键入一个变量，你是不是看我上面的代码了，最底下的是我的，上面的是@赵四老师的

user: user-4
content: # include <stdio.h>//int char 输入容易出问题 下面的代码可以解决这个问题 # include <conio.h> # define Limit 40000000 # define N 10  //如果要录入X个字节则 N=X int  get_GBK(char *A,int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度 int main() {     char A[N+1];     while(1)     {         printf("输入:");         get_GBK(A,2,N);         puts(A);     }     return 0; } int  get_GBK(char *A,int min,int max) {     int B,C,D;     do             {                 for(B=max+printf("["),C=1; C<B; C++)printf(" ");                 printf("]\b");                 while(--B)printf("\b");                 while((C=getch())!='\r')if(C>127||C==8)                     {                         if(C!=8&&B<max&&printf("%c",C))A[B++]=C;                         else if(C==8&&B>0)                         {                            printf("\b \b");                             if(B&1)                             {                                 B--;                                 if(B)printf("\b \b");                                 else printf("[ ");                             }                             else  B-=2;                             printf("\b");                         }                         else if(B>=max)                         {                             D=printf("]  长度:[%d,%d]!",min,max);                             for(C=0; C<Limit; C++);                             while(--D)printf("\b \b");                             printf("\b");                         }                     }                 A[B]=0;                 if(B<min)                 {                     for(C=B; C<max; C++)printf(" ");                     D=max+printf("]  长度:[%d,%d]!",min,max);                     for(C=0; C<Limit; C++);                     while(D--)printf("\b \b");                     printf("\b");                 }             }while(B<min);     printf("\n");     return B; }  对不起 看了你的要求是 输入汉字  你看看这个可以不

user: user-4
content: # include <stdio.h>//int char 输入容易出问题 下面的代码可以解决这个问题 # include <conio.h> # define N 10  //如果要录入X个字节则 N=X int user_password(char *A,int min,int max,int F);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度 int main() {     char A[N+1],B[2*N+1];     printf("用户名:");     user_password(A,2,N,0);     printf("密  码:");     user_password(B,6,2*N,1);     printf("用户名:");     puts(A);     printf("密  码:");     puts(B);     return 0; } int user_password(char *A,int min,int max,int F)//F=0录入密码 否则 录入 用户名 {     int B,C,D;     char S[][7]={"用户名","密码"};     do     {         B=max+printf("[");for(C=1; C<B; C++)printf(" ");printf("]");         while(B--)printf("\b");         B=0;         while((C=getch())!='\r')         if(C>='0'&&C<='9'||C>='a'&&C<='z'||C>='A'&&C<='Z'||C=='_'||C==8)             {             if(C!=8&&B<max)             {                 if(F)printf("*");//密码                 else printf("%c",C);//用户名                 A[B++]=C;             }             else if(C==8&&B>0)             {                 printf("\b \b");                 B--;             }             else if(B>=max)             {                 D=printf("]%s长度:[%d,%d]!",S[F],min,max);                 for(C=0; C<60000000; C++);                 while(D-->1)printf("\b \b");                 printf("\b");             }         }         A[B]=0;         if(B<min)         {             for(C=B; C<max; C++)printf(" ");             D=max+printf("]%s长度:[%d,%d]!",S[F],min,max);             for(C=0; C<60000000; C++);             while(D--)printf("\b \b");             printf("\b");         }     }while(B<min);     printf("\n");     return B; }  这个行不？

user: user-0
content: 引用 8 楼 zyx6680599 的回复:[quote=引用 7 楼 user-4 的回复:] # include <stdio.h>//int char 输入容易出问题 下面的代码可以解决这个问题 # define N 10  //如果要录入X个字节则 N=X int Getchar(char A[],int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度 int gainint(int *p,int a,int b); int main(){ 	char A[N+1];//最后一位存'\0' 	int B; 	printf("输入字符串:1--1字节");     Getchar(A,1,1);      printf("输入字符串:0--%d字节",N);     Getchar(A,0,N);//因为min=0  这个时候直接输入回车 结束录入 字符串为空字符串 	 printf("输入字符串:1--%d字节",N);     Getchar(A,1,N);//因为min=1  这个时候直接输入回车 是不会结束录入的 	printf("输入B 1----100："); 	gainint(&B,1,100);     printf("输入B 2----4："); 	gainint(&B,2,4);     return 0; } int gainint(int *p,int a,int b)//输入int *p直至满足(a,b)输入结束，并返回*p的位数       {            do{               *p=a-1;    //此处是为了减少意外情况的发生 虽然那种意外情况不常见         scanf("%d",p);               while(getchar()!='\n');               if(*p>b||*p<a)                   printf("输入有误,请重新输入(%d--%d):\n",a,b);           }while(*p>b||*p<a);           return *p;       }       int Getchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度     {         int B,C;//B保存A的长度 C记录缓冲区的字符串         do{             B=-1;  C=0; //每次用户输入错误而循环时 都要初始化             fgets(A,max+1,stdin);//从键盘录入字符             while(A[++B]);  //求A的字符串长度             if(A[B-1]!='\n') while(getchar()!='\n') C++;    //如果缓冲区里读入的不是\n则记录字符串数量             else  A[--B]='\0'; //☆  去掉\n 并且字符串长度-1             if(C||B&&B<min) //如果缓冲区有字符串或者长度不够 则提示错误   但如果用户只输入回车而且min!=0则不提示错误 但还要输入当前字符串               printf("您输入的字符串长度:%d字节\n请重新输入!\n注:只输入(%d--%d)个字节!\n",B+C,min,max);         }while(C||B<min);         return B;//返回B 即:A字符串的长度     }       # include <stdio.h>//int char 输入容易出问题 下面的代码可以解决这个问题   # define N 10  //如果要录入X个字节则 N=X   int Getchar(char A[],int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度   int gainint(int *p,int a,int b);   int main(){       char A[N+1];//最后一位存'\0'       int L,min,max;       do{     printf("请输入字符串的长度的最小值[0,%d]：",N);     gainint(&min,0,N);     printf("请输入字符串的长度的最大值[%d,%d]：",min,N);     gainint(&max,min,N);     printf("请输入字符串[%d,%d]:",min,max);     Getchar(A,min,max);     printf("字符串：%s\n",A);     }while(1);     return 0;   }   int gainint(int *p,int a,int b)//输入int *p直至满足(a,b)输入结束，并返回*p的位数         {              do{                 *p=a-1;    //此处是为了减少意外情况的发生 虽然那种意外情况不常见           scanf("%d",p);                 while(getchar()!='\n');                 if(*p>b||*p<a)                     printf("输入有误,请重新输入[%d--%d]:",a,b);             }while(*p>b||*p<a);             return *p;         } int Getchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度       {           int B,C;      do{               A[max]=B=C=0;           while((A[B++]=getchar())!='\n'&&B<max);           if(A[B-1]!='\n')while(getchar()!='\n'&&++C);               else A[--B]=0;        if(C||B&&B<min)          printf("您录入的字符串长度:%d字节\n只录入(%d--%d)个字节!\n",B+C,min,max);           }while(C||B<min);           return B;     }  这两个Getchar 你看哪好点你用哪个 希望能帮到你 其实用几个getch()输入不同的变量，用一个数组存储就行了虚假生conio.h[/quote] 抱歉前几天比较忙没有仔细看。 我复制了你的代码尝试了一下，发现了一个问题。 我其实是想用户在屏幕上输入指定数量的字符，如果超过则禁止输入。但是你的这两个例子都是判断输入过多后裁剪字符的呢。