C 中这两个逐个字符读取函数有什么区别?

问题描述 投票:0回答:1

有两个函数可以逐字符读取字符串。问题在于结果的不同细微差别。无论使用 while 循环的循环在输入新行字符后是否丢弃更多字符,for 循环的第二个循环都会停止在数组中保存字符 when ' ' 但不知何故,如果再次请求此功能,它会直接打印上一次留下的字符,然后您甚至可以自己输入。

您可以通过更改功能来尝试该程序,并检查输出的差异是否明显,但我不明白。

#include <stdio.h>
#include <ctype.h>

int read_lineD_Solution(char str[], int n);
int read_line(char str[], int n);

int main(void)
{
    char a[100] ;

    printf("Enter a sentece: ");

    read_lineD_Solution(a, 3);

    printf("%s\n", a);

    printf("Enter a sentece: ");

    read_lineD_Solution(a, 3);

    printf("%s\n", a);

    return 0;
}

int read_line(char str[], int n)
{
    int ch, i=0;

    while ((ch=getchar()) != '\n')
        if (i < n)
            str[i++] = ch;
    str[i] = '\0';
    
    return i;
}

int read_lineD_Solution(char str[], int n)
{
    int ch, i;

    for (i=0;i<n; i++) {
        ch = getchar();
        if (ch == '\n')
            break;
        str[i] = ch;
    }
    str[i] = '\0';
    return i;
}

我尝试将 while 循环更改为“for”循环,反之亦然。我还改变了条件的顺序。这两种方法都为我提供了类似的输出,但具有意外的行为。

c string for-loop while-loop
1个回答
0
投票

read_line()
读至行尾。

read_lineD_Solution()
读取到
n
字符行的末尾,以先到者为准。

read_lineD_Solution()
有一个错误:当读取
n
字符时,
str[i] = '\0';
写入过去的缓冲区。

两者都不能很好地处理

getchar()
返回
EOF
,这应该结束读取。

© www.soinside.com 2019 - 2024. All rights reserved.