扫描 C 中的值直到遇到换行符 '\n'
Scanning values in C till hit a new-line char, '\n'
如何 scanf()
输入数组中的整数值,直到我按下回车键。
我相信我可以使用getchar() != '\n'
。
但是我如何遍历该行?
假设我的输入是20 21 2 12 2
。我想要一个包含所有这些输入的数组。
我可以使用哪些给定的函数来扫描它们。
- 您正在尝试将整数作为字符读取,因此读取后需要将其转换为整数。
- 使用
fgets()
将行读取到缓冲区,然后解析输入缓冲区以获取整数。
- 将整数存储到数组中。
代码看起来像
char buf[300];
int a[5],i=0;
fgets(buf,sizeof(buf),stdin);
char *p = strtok(buf," ");
while(p != NULL)
{
char *endptr;
a[i] = strtol(p,&endptr,10);
if ((*endptr != '[=10=]') && (isspace(*endptr) == 0))
printf("warning: invalid value detected\n");
else
i++;
p = strtok(NULL," ");
}
您可以使用 strtol()
而不是 atoi()
来将字符串转换为整数。
PS:您的 buf
应该足够大以容纳整行。 fgets()
读到换行符。
如果你使用getchar()
,你会一个一个地获取数字,所以你需要
首先将它们存储在缓冲区中,当白色 space 出现时,
您将这些数字转换为数字,并将其存储到数组中。
这是我为您制作的代码的解释。
- 第一个if语句:如果获取的字符是数字,则将其存储在
buf
中
- 2nd if 语句:如果获取的字符是白色 space 或 EOL,并且至少 1 个数字存储在
buf
中,将数字转换为数字并将其存储在数组 a
中.
- 第三个 if 语句:如果获取的字符不是数字或白色 space 或 EOL,则警告用户。
- 第4条if语句:如果获取的字符是EOL,结束循环。
下面的代码工作正常。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(){
#define BUFSIZE 50
#define ARRAYSIZE 5
int i,k,a[ARRAYSIZE];
char c,buf[BUFSIZE];
for(i=0,k=0;(i<BUFSIZE)&&(k<ARRAYSIZE);){
c=getchar();
if(isdigit(c)){
buf[i++] = c;
}else if((i>0) && (c==' ' || c=='\n')){
buf[i] = '[=10=]';
a[k++] = atoi(buf);
i=0;
}else if(!(c==' ' || c=='\n')){
printf("warning : invalid value %c is detected\n",c);
i=0;
}
if(c=='\n'){
break;
}
}
printf("input :");
for(i=0;i<ARRAYSIZE;i++){
printf("%d, ",a[i]);
}
printf("\n");
}
如何 scanf()
输入数组中的整数值,直到我按下回车键。
我相信我可以使用getchar() != '\n'
。
但是我如何遍历该行?
假设我的输入是20 21 2 12 2
。我想要一个包含所有这些输入的数组。
我可以使用哪些给定的函数来扫描它们。
- 您正在尝试将整数作为字符读取,因此读取后需要将其转换为整数。
- 使用
fgets()
将行读取到缓冲区,然后解析输入缓冲区以获取整数。 - 将整数存储到数组中。
代码看起来像
char buf[300];
int a[5],i=0;
fgets(buf,sizeof(buf),stdin);
char *p = strtok(buf," ");
while(p != NULL)
{
char *endptr;
a[i] = strtol(p,&endptr,10);
if ((*endptr != '[=10=]') && (isspace(*endptr) == 0))
printf("warning: invalid value detected\n");
else
i++;
p = strtok(NULL," ");
}
您可以使用 strtol()
而不是 atoi()
来将字符串转换为整数。
PS:您的 buf
应该足够大以容纳整行。 fgets()
读到换行符。
如果你使用getchar()
,你会一个一个地获取数字,所以你需要
首先将它们存储在缓冲区中,当白色 space 出现时,
您将这些数字转换为数字,并将其存储到数组中。
这是我为您制作的代码的解释。
- 第一个if语句:如果获取的字符是数字,则将其存储在
buf
中
- 2nd if 语句:如果获取的字符是白色 space 或 EOL,并且至少 1 个数字存储在
buf
中,将数字转换为数字并将其存储在数组a
中. - 第三个 if 语句:如果获取的字符不是数字或白色 space 或 EOL,则警告用户。
- 第4条if语句:如果获取的字符是EOL,结束循环。
下面的代码工作正常。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(){
#define BUFSIZE 50
#define ARRAYSIZE 5
int i,k,a[ARRAYSIZE];
char c,buf[BUFSIZE];
for(i=0,k=0;(i<BUFSIZE)&&(k<ARRAYSIZE);){
c=getchar();
if(isdigit(c)){
buf[i++] = c;
}else if((i>0) && (c==' ' || c=='\n')){
buf[i] = '[=10=]';
a[k++] = atoi(buf);
i=0;
}else if(!(c==' ' || c=='\n')){
printf("warning : invalid value %c is detected\n",c);
i=0;
}
if(c=='\n'){
break;
}
}
printf("input :");
for(i=0;i<ARRAYSIZE;i++){
printf("%d, ",a[i]);
}
printf("\n");
}