scanf读取可变字符数

scanf读取可变字符数,c,C,我想知道如果我按enter键,如何让scanf跳过读取字符。。。我的代码如下: #include <stdio.h> int main(void) { int a, status; char b; printf("Please enter a positive number immediately" "followed by at most one lower-case letter:\n\n"); status = sca

我想知道如果我按enter键,如何让scanf跳过读取字符。。。我的代码如下:

#include <stdio.h>

int main(void)

{
    int a, status;
    char b;
    printf("Please enter a positive number immediately"
           "followed by at  most one lower-case letter:\n\n");
    status = scanf("%i%c", &a, &b);
    if (status == 1 && getchar() == '\n') {
        printf("\nThank you!\n");
    }
    return 0;
}

但这是行不通的。

如评论中所述,最好的做法是使用
fgets
读取字符串,然后解析并验证它。将为您提供足够的资源,让您了解如何使用
fgets

这里有一个方法你可以采取。请注意,此代码不会尝试验证用户可以提供的每一个可能的输入,而是为您提供一个合理的方向,如果假设输入是正确的,您可以采取该方向来解决问题。我将把验证的任务留给你。下面的代码应该提供足够的工具来完成剩下的任务。查看如何使用
for
循环逐步通过
缓冲区,并确保输入正确。使用
isalpha()
isdigit()
测试每个字符。您还可以实现自己的功能,按原样测试每个字符

#包括
#包含//用于atoi()
#包括//用于strlen()
#包括//用于isalpha()
#定义最大输入长度500
内部主(空)
{
//初始化变量总是一个好主意,以避免未定义的行为!
字符缓冲区[MAX_INPUTLENGTH]={'\0'};
int a=0,status=1,length=0;
字符b='\0';
printf(“请立即输入正数”
“后跟最多一个小写字母:\n\n”);
//这将为您提供一个可以使用的字符串
fgets(缓冲区、sizeof(缓冲区)、stdin);
长度=strlen(缓冲区);
缓冲区[长度-1]='\0';//删除尾部'\n'
长度--;
//现在看看最后一个字符是否是字母
if(isalpha(缓冲区[length-1])){
b=缓冲区[长度-1];//然后分配并。。
缓冲区[长度-1]='\0';//修剪字母
}
//此函数用于将剩余字符串转换为int
a=atoi(缓冲区);
//使用调试器并观察这些函数如何按顺序工作
//验证输入。目前,状态始终为1!
如果(状态==1){
printf(“\n谢谢!\n”);
}
返回0;
}

正如@Jonathan在下面的注释中所指出的,要可移植地获取数组的计数,应该使用
sizeof(buffer)/sizeof(buffer[0])
。由于您使用的是
char[]
sizeof(buffer[0])
的计算结果为
1
,因此在调用
fgets

时可以忽略,正如注释中所述,最好的做法是使用
fgets
读取字符串,然后对其进行解析和验证。将为您提供足够的资源,让您了解如何使用
fgets

这里有一个方法你可以采取。请注意,此代码不会尝试验证用户可以提供的每一个可能的输入,而是为您提供一个合理的方向,如果假设输入是正确的,您可以采取该方向来解决问题。我将把验证的任务留给你。下面的代码应该提供足够的工具来完成剩下的任务。查看如何使用
for
循环逐步通过
缓冲区,并确保输入正确。使用
isalpha()
isdigit()
测试每个字符。您还可以实现自己的功能,按原样测试每个字符

#包括
#包含//用于atoi()
#包括//用于strlen()
#包括//用于isalpha()
#定义最大输入长度500
内部主(空)
{
//初始化变量总是一个好主意,以避免未定义的行为!
字符缓冲区[MAX_INPUTLENGTH]={'\0'};
int a=0,status=1,length=0;
字符b='\0';
printf(“请立即输入正数”
“后跟最多一个小写字母:\n\n”);
//这将为您提供一个可以使用的字符串
fgets(缓冲区、sizeof(缓冲区)、stdin);
长度=strlen(缓冲区);
缓冲区[长度-1]='\0';//删除尾部'\n'
长度--;
//现在看看最后一个字符是否是字母
if(isalpha(缓冲区[length-1])){
b=缓冲区[长度-1];//然后分配并。。
缓冲区[长度-1]='\0';//修剪字母
}
//此函数用于将剩余字符串转换为int
a=atoi(缓冲区);
//使用调试器并观察这些函数如何按顺序工作
//验证输入。目前,状态始终为1!
如果(状态==1){
printf(“\n谢谢!\n”);
}
返回0;
}

正如@Jonathan在下面的注释中所指出的,要可移植地获取数组的计数,应该使用
sizeof(buffer)/sizeof(buffer[0])
。由于您使用的是
char[]
sizeof(buffer[0])
的计算结果为
1
,因此在调用
fgets

时可以省略。我建议使用
fgets
读取整行,然后使用
sscanf
转换行开始处的数字(如果有)。如果
scanf
成功后,它将返回
2
,而不是
1
fgets
在这里更有意义。我才刚开始编程,所以我对fgets不熟悉。在这种情况下,我将如何使用它?你能给我发一行吗?如果你加了一行:
printf(“%d[%c]=%d\n”,a,b,status)
scanf()
之后,对给定的内容进行调试打印,如果您键入
31
作为数字,那么您会在一行看到
31[
,在下一行看到
]=2
,因为
%c
会将换行作为字符读取,并且因为
scanf()
作为一个整体将返回2,因为它成功地转换了两个值。如果使用
%i%[a-z]“
作为格式字符串,则在
状态中返回1,在
a
中返回31,在
b
中返回垃圾。我建议使用
fgets
读取整行,然后在
if (status == 1 && getchar() == '\n')
#include <stdio.h>
#include <stdlib.h> //for atoi() 
#include <string.h> //for strlen() 
#include <ctype.h> //for isalpha()
#define MAX_INPUTLENGTH 500
int main(void)
{
    //Always a good idea to initialize variables to avoid Undefined Behaviour!
    char buffer[MAX_INPUTLENGTH] = { '\0' };
    int a = 0, status = 1, length = 0;
    char b = '\0';

    printf("Please enter a positive number immediately"
        "followed by at  most one lower-case letter:\n\n");

    //this gets you a string you can work with
    fgets(buffer, sizeof(buffer), stdin);
    length = strlen(buffer);
    buffer[length - 1] = '\0';//remove the trailing '\n'
    length--;

    //now see if last character is a letter
    if (isalpha(buffer[length - 1])) {
        b = buffer[length - 1];//then assign and..
        buffer[length - 1] = '\0';//trim the letter
    }

    //this function converts the remaining string to an int
    a = atoi(buffer);

    //Use the debugger and observe how these functions work in order
    //to validate the input. for now, status is always 1!
    if (status == 1) {
        printf("\nThank you!\n");
    }
    return 0;
}