2016-11-08 35 views
1

我已经编写了从小写字母变为大写字母的程序。问题是,我不知道如何让它读取整个文本而不是一行。按下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; 
} 
+0

你是什么意思“阅读全文,而不是一条线”? – Rafal

+0

不同的选项在这里:http://stackoverflow.com/a/1836454/694576 – alk

+0

@Rafal我的意思是不要停止接受数据按下输入后,在控制台CTRL + Z之后 – NouName

回答

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。

+0

“*'fgets()'会在遇到换行符时停止。*”值得一提的是,这是Windows特有的。在IX'ish系统上,'Ctrl-D'表示'EOF'很好地结束了'fgets()'。 – alk

+0

我并不是指'D' <->'Z'的差异,但是事实上,如果已经给出了一些输入,Windows上的Ctrl-Z将不会结束fgets(),而在UNIX上在这种情况下为'Ctrl-D')。 – alk

+0

通过任何操作系统特定的方式发送EOF将结束fgets()。但是AFAICT,OP的问题是*不是检测EOF,而是读取多行(基本上OP由于'fgets()'停在换行符而被阻止,而他想要读取更多内容直到EOF由他明确发送)。 – usr

3

只是把你fgets(string, 1000, stdin)成,而loop.here是解决

#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; 
} 
+0

你在Windows上测试过这个吗? – alk

+0

@alk是的!首先我尝试在我的窗口中工作正常,然后发布在这里:)。 – Real73

+0

使用哪种编译器? – alk

相关问题