在C编程中,当达到EOF时如何退出stdin

在C编程中,当达到EOF时如何退出stdin,c,arrays,stdin,eof,getchar,C,Arrays,Stdin,Eof,Getchar,我的程序有问题。它的目的是从用户那里读取输入的数字,当用户停止输入数字时(ctrl-d),它会收集输入的数字并打印出“奇数:等等” “偶数是:废话” 我在如何在EOF退出程序方面遇到了问题,当我感觉我已经克服了这个问题时,另一个问题出现了,那就是我的程序没有从数组中打印数字。它只打印“奇数为:”和“偶数为:” 感谢您的帮助。 谢谢 #包括 #包括 #包括 内部主(空){ int n,i,数组[1000]; i=0; while(i=getchar()!=EOF){ scanf(“%d”和数组[i

我的程序有问题。它的目的是从用户那里读取输入的数字,当用户停止输入数字时(ctrl-d),它会收集输入的数字并打印出“奇数:等等” “偶数是:废话”

我在如何在EOF退出程序方面遇到了问题,当我感觉我已经克服了这个问题时,另一个问题出现了,那就是我的程序没有从数组中打印数字。它只打印“奇数为:”和“偶数为:”

感谢您的帮助。 谢谢

#包括
#包括
#包括
内部主(空){
int n,i,数组[1000];
i=0;
while(i=getchar()!=EOF){
scanf(“%d”和数组[i]);
i++;
}   
printf(“奇数为:”);
i=0;
而(i=getchar()!=EOF){
if(数组[i]%2!=0){
printf(“%d”,数组[i]);
i++;
}
}
printf(“\n编号为:”);
i=0;
而(i=getchar()!=EOF){
if(数组[i]%2==0){
printf(“%d”,数组[i]);
i++;
} 
}
printf(“\n”);
返回0;
}

将输入循环更改为:

n = 0;

while ( 1 == scanf("%d", &array[n]) )
    ++n;
实际上,您要做的是一直读取数字,直到读取尝试失败;此循环条件表示该逻辑。忘掉EOF吧。(最好在
n
达到
1000
时添加停止逻辑,以避免缓冲区溢出)


在输出循环中,您不想进行任何输入,因此调用
getchar()
不是一个好主意。相反,使用一个“正常”循环,
用于(i=0;i

执行到int的单位数转换

你可能会让事情变得比需要的更艰难。虽然您可以使用
While(scanf(“%d”)和&array[i])==1)
读取以空格分隔的整数并避免执行手动转换,但如果您的目的是读取单个数字,那么使用
getchar()
就可以了。(就此而言,您可以使用
getchar()
读取任何多位数整数,您只需提供从ASCII字符到最终数值的转换)

单位数字符的手动转换是直接的吗?当您以字符形式读取数字时,您不是在读取由数字表示的整数值,而是在读取代表每个数字的字符的ASCII值。看见要将单个ASCII字符数字转换为其整数值,必须减去
'0'
的ASCII值。(注意:单引号很重要)

例如,如果您使用
int c=getchar()读取一个数字
,则需要减去
'0'
以获得一位数整数值,例如
int n=c-'0'

填充数组时,必须始终防止写入超出数组边界的内容。如果您声明
int数组[1000]={0}
(它有可用的从零开始的数组索引
0-999
),然后必须验证您从未写入超出索引
999
或未定义的行为结果。为了保护数组边界,只需跟踪已填充索引的数量,并测试它始终低于可用数组元素的数量,例如

while (n < MAX && (c = getchar()) != EOF)   /* always protect array bounds */
    if ('0' <= c && c <= '9')               /* only handle digits */
        array[n++] = c - '0';               /* convert ASCII to int */
当然,对于偶数,位将是
0
(例如二进制中的
8
1000
),因此相应的测试可以是:

    if ((array[i] & 1) == 0)                /* if ones-bit is 0, even */
        printf (" %d", array[i]);
将所有片段放在一起,您可以存储在
数组中读取的所有单个数字
,然后以非常简单的方式分离奇偶数以便打印(注意:不需要
stdlib.h
math.h

示例使用/输出

$ echo "01234567890123456789" | ./bin/arrayevenodd

array        :  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
array - odd  :  1 3 5 7 9 1 3 5 7 9
array - even :  0 2 4 6 8 0 2 4 6 8
$ echo "1,2,3,5,76,435" | ./bin/arrayevenodd2

array        :  1 2 3 5 76 435
array - odd  :  1 3 5 435
array - even :  2 76
仔细检查一下,如果你还有其他问题,请告诉我


执行手动多位数转换到
int

如果需要从字符转换多位数整数,最简单的方法是使用一个为您提供转换的函数(例如,
scanf
函数系列,或使用面向行的
fgets
getline
并使用
strtok
解析和转换数字字符串,然后使用
strtol
,或使用
sscanf
解析等。)

但是,手动将
getchar()
读取的单个字符转换为多位数整数是很简单的。您只需检查一个有效字符,而不是整数的开头(包括
+/-
的前缀)并对每个数字求和,通过在加法之前将总和乘以
10
,为该数字的位置提供适当的偏移量(或者,如果为了提高编码效率而将总和设为负和,则实际减去)每个数字直到到达下一个非数字,然后将最终和添加到数组中,并推进数组索引

在构建总和时,在将最终总和添加到数组之前,您需要检查整数溢出。(您可以随意处理溢出情况,下面的示例仅抛出错误并退出)

手动转换可能会增加大约20行代码,例如

#include <stdio.h>
#include <stdint.h> /* exact length types */
#include <limits.h> /* INT_X constants */

#define MAX 1000    /* define constant rather than use 'magic' number in code */

int main (void)
{
    int array[MAX] = {0},
        c, i, start = 0, sign = 1, n = 0;
    int64_t sum = 0;

    while (n < MAX && (c = getchar()) != EOF) { /* always protect array bounds */
        if (!start) {                           /* flag to start building int  */
            start = 1;                          /* flag - working on int */
            if (c == '+')                       /* handle leading '+' sign */
                continue;
            else if (c == '-')                  /* handle leading '-' sign */
                sign = -1;
            else if ('0' <= c && c <= '9')      /* handle digits */
                sum = sum * 10 - (c - '0');     /* note: sum always computed */
            else                                /*       as negative value   */
                start = 0;                      /* reset - char not handled  */
        }
        else if ('0' <= c && c <= '9') {        /* handle digits */
            sum = sum * 10 - (c - '0');         /* convert ASCII to int */
            if (sum < INT_MIN || (sign != -1 && -sum > INT_MAX))
                goto err;               /* check for overflow, handle error */
        }
        else {                          /* non-digit ends conversion */
            if (sum)                    /* if sum has value, add to array */
                array[n++] = sign != -1 ? -sum : sum;
            sign = 1;                   /* reset values for next conversion */
            start = 0;
            sum = 0;
        }
    }
    if (sum)    /* add last element to array on EOF */
        array[n++] = sign != -1 ? -sum : sum;

    printf ("\narray        : ");               /* output array contents */
    for (i = 0; i < n; i++)
        printf (" %d", array[i]);

    printf ("\narray - odd  : ");
    for (i = 0; i < n; i++)
        if (array[i] & 1)                       /* if ones-bit is 1, odd */
            printf (" %d", array[i]);

    printf ("\narray - even : ");
    for (i = 0; i < n; i++)
        if ((array[i] & 1) == 0)                /* if ones-bit is 0, even */
            printf (" %d", array[i]);

    putchar ('\n');                             /* tidy up w/newline */

    return 0;

    err:

    fprintf (stderr, "error: overflow detected - array[%d]\n", n);
    return 1;
}
带有“+/-”前缀的示例

$ echo "1,2,-3,+5,-76,435" | ./bin/arrayevenodd2

array        :  1 2 -3 5 -76 435
array - odd  :  1 -3 5 435
array - even :  2 -76
查看新示例,如果您还有任何问题,请告诉我。

i=0;while(i=getchar()!=EOF){if(数组[i]%2!=0){printf(“%d”,数组[i]);i++;}}
for(n=i,i=0;i
检查这个:
while(i=getchar()!=EOF){scanf(“%d”)和数组[i]);i++;}
-->
while(scanf(“%d”)和数组[i])==1{i++;}
i=getchar()!=EOF
类似于
i
$ echo "01234567890123456789" | ./bin/arrayevenodd

array        :  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
array - odd  :  1 3 5 7 9 1 3 5 7 9
array - even :  0 2 4 6 8 0 2 4 6 8
#include <stdio.h>
#include <stdint.h> /* exact length types */
#include <limits.h> /* INT_X constants */

#define MAX 1000    /* define constant rather than use 'magic' number in code */

int main (void)
{
    int array[MAX] = {0},
        c, i, start = 0, sign = 1, n = 0;
    int64_t sum = 0;

    while (n < MAX && (c = getchar()) != EOF) { /* always protect array bounds */
        if (!start) {                           /* flag to start building int  */
            start = 1;                          /* flag - working on int */
            if (c == '+')                       /* handle leading '+' sign */
                continue;
            else if (c == '-')                  /* handle leading '-' sign */
                sign = -1;
            else if ('0' <= c && c <= '9')      /* handle digits */
                sum = sum * 10 - (c - '0');     /* note: sum always computed */
            else                                /*       as negative value   */
                start = 0;                      /* reset - char not handled  */
        }
        else if ('0' <= c && c <= '9') {        /* handle digits */
            sum = sum * 10 - (c - '0');         /* convert ASCII to int */
            if (sum < INT_MIN || (sign != -1 && -sum > INT_MAX))
                goto err;               /* check for overflow, handle error */
        }
        else {                          /* non-digit ends conversion */
            if (sum)                    /* if sum has value, add to array */
                array[n++] = sign != -1 ? -sum : sum;
            sign = 1;                   /* reset values for next conversion */
            start = 0;
            sum = 0;
        }
    }
    if (sum)    /* add last element to array on EOF */
        array[n++] = sign != -1 ? -sum : sum;

    printf ("\narray        : ");               /* output array contents */
    for (i = 0; i < n; i++)
        printf (" %d", array[i]);

    printf ("\narray - odd  : ");
    for (i = 0; i < n; i++)
        if (array[i] & 1)                       /* if ones-bit is 1, odd */
            printf (" %d", array[i]);

    printf ("\narray - even : ");
    for (i = 0; i < n; i++)
        if ((array[i] & 1) == 0)                /* if ones-bit is 0, even */
            printf (" %d", array[i]);

    putchar ('\n');                             /* tidy up w/newline */

    return 0;

    err:

    fprintf (stderr, "error: overflow detected - array[%d]\n", n);
    return 1;
}
$ echo "1,2,3,5,76,435" | ./bin/arrayevenodd2

array        :  1 2 3 5 76 435
array - odd  :  1 3 5 435
array - even :  2 76
$ echo "1,2,-3,+5,-76,435" | ./bin/arrayevenodd2

array        :  1 2 -3 5 -76 435
array - odd  :  1 -3 5 435
array - even :  2 -76