在C中扫描多行

时间:2017-05-28 05:40:10

标签: c scanf

我是 C 编程的新手。我正在上课,我必须:

  

程序将从标准输入中获取所有输入,可能对其进行转换,然后将其输出到标准输出。

     

程序将逐行读入输入。每行都将进行转换(如果有的话)。然后打印出变换后的行。

     

您必须从用户处读取,直到不再有文字为止。可以在终端中键入Ctrl + D以指示没有文本。

我不是一个正在寻找为我做的答案的学生,但我完全迷失在这里。我试着用:

char*buf = NULL;
while (fscanf(stdin, "%ms", &buf) > 0)
{ do transform } 

但我没有运气。所以任何帮助都表示赞赏。我也不知道 Ctrl + D 部分。

3 个答案:

答案 0 :(得分:4)

char*buf = NULL;
while (fscanf(stdin, "%ms", &buf) > 0)

有以下问题。

  1. buf并未指出可以读取和存储输入的任何有效内容。
  2. %ms不是标准的C格式说明符(在POSIX标准兼容平台上支持,感谢@JonathanLeffler)。
  3. 最好使用fgets来阅读文字行。
  4. 我建议:

    // Make LINE_LENGTH large enough for your needs.
    #define LINE_LENGTH 200
    char buf[LINE_LENGTH]; 
    while ( fgets(buf, LINE_LENGTH, stdin) != NULL )
    {
       // Use buf
    }
    

答案 1 :(得分:2)

Ctrl + D通常是EOF所以只需检查一下。 fscanf(stdin, "%ms", &buf)!=EOF

此外,您只保留了一个指向char的指针,您应该静态保留数组或进行动态分配。 char buf[255]; 要么 char *buf = (char*) malloc(255);

编辑: 如Jonathan Leffler fscanf()所述,如果您的行没有使用特定格式fgets() https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm

,这真是太糟糕了

答案 2 :(得分:1)

由于您标记为C ++,请尝试以下操作:

std::string text;
std::getline(cin, text);

std::string会根据需要动态展开。

getline函数将读取,直到读取行尾字符。

比读入字符数组更安全。