C – 当时读取一个int

我有这个输入:

输入:2015年

我想像这样扫描他:

scanf("%1d", &arr); 

但这绝对是错误的。 我能做什么? 我希望通过整数接收输入整数,如’2’,’0’,’1’,’5’,而不是像“2015”。

只需单独读取每个字符,并将单个char转换为整数。

 #include  int main(int argc, char* argv[]) { size_t len, i; char buff[64]; fgets(buff, sizeof(buff), stdin); for(i = 0, len = strlen(buff); i < len; ++i) { int curr = buff[i] - '0'; /* subtracting '0' converts the char to an int */ printf("%d\n", curr); } } 

如果您的输入是固定大小,如2015那么您可以使用

 int arr[4]; for(int i=0; i<4; i++){ scanf("%1d", arr+i); } 

但是对于一般情况,您可以使用fgets读取字符串。

我建议阅读整行,然后专门解析它。

要在POSIX系统上读取一行,请使用getline(3) ,它将在堆中分配行缓冲区(不要忘记将包含该行的指针初始化为NULL并将变量大小初始化为0,并free您完成的行)。 如果你不getline没有getline的系统,请声明一个大的(例如至少256字节)缓冲区并使用fgets(3) 。 BTW,在Linux上,来自终端的可编辑输入-aka tty – (不是管道或文件,所以使用isatty(3)进行测试)你甚至可以考虑使用readline(3) ; 尝试一次,它非常方便!

一旦整行在内存中,你就可以解析它(前提是你定义了该行的语法,至少在你的头脑中;一个例子通常是不够的;你可能想在你的文档中使用EBNF )。

您可以使用sscanf(3)来解析该行或使用一些迭代代码手动解析它等等。不要忘记检查已返回的扫描项目数。 也许%n可以很方便(获得字节数)。 您也可以手动解析该行,或使用strtol(3)解析long数,(或者strtok(3)我不喜欢因为它是有状态的)等…