c# 为什么它不在我使用CTRL+D退出循环后等待我输入字符串

beq87vna  于 2023-01-28  发布在  C#
关注(0)|答案(2)|浏览(217)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char c, char_array[100];
    int i = 0;
    printf("Enter characters (press CTRL+D to end):\n");
    while(fgets(char_array+i,sizeof(char_array)-i,stdin)) {
        i = i + strlen(char_array+i);
        if(char_array[i-1] == EOF)
            break;
    }
    char_array[i-1] = '\0';
    strtok(char_array,"\n");
    printf("\nEnter a string:\n");
    char string[100];
    fgets(string,sizeof(string),stdin);
    printf("\nCharacter Array: %s\n", char_array);
    printf("String: %s\n", string);
    return 0;
}

这是代码,我已经尝试了许多不同的变化(更简单),但它总是有同样的问题...我输入字符,按CTRL+D,它结束了没有等待我输入字符串。请帮助
我尝试了一切我可以,但我只是不能使它工作,我的朋友也不能...我有和考试,我需要这是在3天内完成最大,所以我需要所有的帮助,我可以得到。

az31mfrm

az31mfrm1#

对于stdio流,error/eof是 sticky --也就是说,一旦发生错误或eof条件,对FILE *的进一步操作将继续返回EOF(-1)或NULL(取决于函数),而不是尝试进一步读取或写入任何内容。
要重置FILE *上的eof状态,需要调用clearerr(stdin),完成后,可以从终端读取其他输入。

vjrehmav

vjrehmav2#

  1. fgets()在流关闭时返回NULL。在Linux上,如果终端缓冲区不为空,Ctrl-D将刷新终端缓冲区(但fgets()不会返回,因为它保持行缓冲),并且需要第二个Ctrl-D来触发流的EOF状态。
    1.如果阵列已满,您还希望终止循环:
#define ARRAY_LEN 100

//...

    while(i < ARRAY_LEN - 1 && fgets(char_array + i, ARRAY_LEN - i,stdin)) {
  1. fgets()不会将EOF作为正在读取的字符串的一部分发出,因此这是完全不正确的,并且由于stdin是行缓冲的,因此如果缓冲区已满,则最后一个字符是“\n”或其他字符(如果读取了最后一个字符,则可能是-1或0xff)(无论字符是否有符号,但仍然是错误的):
if(char_array[i-1] == EOF)
            break;

1.下一行:

char_array[i-1] = '\0';

如果数组已满(即数据丢失),则剥离最后一个字符,即\n或我们最后读取的任何字符。
1.由于输入流处于EOF状态,第二个fgets()将返回NULL。您可以在调用fgets()获取第二个字符串之前使用clearerr(stdin)清除该状态。如果流确实结束,例如“hello world”|./your_program , the 2nd fgets()',当然也返回NULL。
我建议您使用空行来表示输入结束:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ARRAY_LEN 100

int main() {
    printf("Enter characters (empty line to end):\n");
    char char_array[ARRAY_LEN];
    for(size_t i = 0; i < ARRAY_LEN - 1; i += strlen(char_array)) {
        if(!fgets(char_array + i, ARRAY_LEN - i, stdin)) {
            printf("fgets() failed\n");
            return 1;
        }
        if(char_array[i] == '\n') {
            char_array[i] = '\0';
            break;
        }
    }
    strtok(char_array, "\n");
    printf("Enter a string:\n");
    char string[ARRAY_LEN];
    char *rv = fgets(string,sizeof(string),stdin);
    printf("Character Array: %s\n", char_array);
    printf("String: %s\n", string);
}

和示例会话:

Enter characters (empty line to end):
hello
world

Enter a string:
friend
Character Array: hello
String: friend

相关问题