名称无法显示

时间:2015-06-30 04:44:09

标签: c char user-input scanf

问题:当输入为 * 时,用户需要重新输入名称。最大输入限制为25个字符,并以 enter 键结束输入。

#include <stdio.h>
#include <conio.h>
#define MAX 25
char welcomeMsg[]= "Please enter your name without '*' or # " ;
char errorMsg[]= "\nError, please re-type your name. ";

void main(void)
{
int j;
char input;
char name[MAX];
j=0;
puts(welcomeMsg);

do
{
    input = getche();
    if(input == '*' || input =='#' )
    {
        puts(errorMsg);
        j = 0;
        continue;
    }
    scanf("%s", name[j]);
    j++;
} while ( j < MAX && input != '\r' );

name[j] = NULL;
puts("\nYour name is");
puts(name);
}

3 个答案:

答案 0 :(得分:0)

scanf("%s", name[j]);

错了,写

 name[j] = input;

代替。给定格式字符串,scanf将读取整个字符串, 但你的程序显然需要阅读字符。

您还需要

#include <stdio.h>

一开始。

哦,

name[j] < 25

应该是

j < MAX

更多错误修正:

char name[MAX+1]; /* one more for the terminating 0 */

name[j]=0; /* instead of NULL */

答案 1 :(得分:0)

我修改了你的代码。请参阅下面的snipet代码

#include <stdio.h>
#include <conio.h>
#define MAX 25
char welcomeMsg[]= "Please enter your name without '*' or # " ;
char errorMsg[]= "\nError, please re-type your name. ";

void main(void)
{
    int j;
    char input;
    char name[MAX];
    j=0;
    puts(welcomeMsg);

    do
    {
        input = getche();
        if(input == '*' || input =='#' )
        {
            puts(errorMsg);
            j = 0;
            continue;
        }
        name[j] = input;
        j++;
    } while ( j < MAX && input != '\r' );

    name[j] = 0;
    puts("\nYour name is");
    puts(name);
}

enter image description here

答案 2 :(得分:0)

由于各种原因,您的计划有误,例如

  • scanf("%s", name[j]);%s需要指向char数组的指针。
  • name[j] = NULL;,NULL是指针类型

相反,我会建议你一个更干净的算法。检查你是否喜欢它。

  1. 使用fgets()阅读用户输入。
  2. 使用strpbrk()搜索*#或其他任何内容(如您所愿)。
  3. 如果strpbrk()返回NULL,则表示您可以进一步使用输入。 resticted chars不存在。
  4. 否则,再次要求输入。
  5. 也就是说,void main(void)不被视为main()的推荐签名,您应该使用int main(void)代替。