读取整个输入而不是单行

时间:2016-11-08 09:28:38

标签: c for-loop fgets

我编写的程序从小写字母变为大写。问题是,我不知道如何使它读取整个文本而不是一行。按Enter键后程序返回输出,我希望它在CTRL + Z之后返回。

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


void makeUpper(char *s) {
    int i;
    for(i = 0; s[i] != '\0'; i++){
        s[i] = toupper(s[i]);
    }
    printf("%s", s);
}


int main() {
    char string[1000];

    fgets(string, 1000, stdin);

    makeUpper(string);
    return 0;
}

2 个答案:

答案 0 :(得分:3)

将你的fgets(string, 1000, stdin)放入while循环中。这是解决方案

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

void makeUpper(char *s) {
    int i;
    for(i = 0; s[i] != '\0'; i++){
        s[i] = toupper(s[i]);
    }
    printf("%s", s);
}


int main() {
    char string[1000];

    while(fgets(string, 1000, stdin)!=NULL)//for getting input untill pressing CTRL+Z.
    {
        makeUpper(string);
    }


    return 0;
}

答案 1 :(得分:2)

一旦遇到换行符,

fgets()就会停止。因此,您无法解决多行问题。所以,你必须看看替代品。

一种方法是使用getchar()是一个循环并读取,只要缓冲区中有空间或收到EOF。:

int main(void) {

    char string[1000];
    size_t i = 0;

    do {
        int ch = getchar();
        if (ch == EOF) break;
        string[i] = ch;
        i++;
    } while (i < sizeof string - 1);
    string[i] = 0;

    makeUpper(string);
    return 0;
}

请记住,ctrl + Z适用于Windows(发送EOF)。在类似* nix的系统上,您必须使用Ctrl + D发送EOF。