扫描 C 语言中的多行

  • 本文关键字:语言 扫描 c scanf
  • 更新时间 :
  • 英文 :


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

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

程序将逐行读取输入。转换(如果有(将按行完成。然后打印出转换后的行。

您必须从用户那里读取,直到没有更多的文本。可以在终端中键入 Ctrl+D 以指示没有剩余文本。

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

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

但我没有运气。因此,任何帮助都值得赞赏。我也不知道 Ctrl+D 部分。

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

有以下问题。

  1. buf 不指向可以读取和存储输入的任何有效内容。
  2. %ms不是标准的 C 格式说明符(在 POSIX 标准兼容平台中受支持,感谢@JonathanLeffler(。
  3. 最好使用fgets来阅读文本行。

我说:

// 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
}

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,那真是个糟糕的主意

既然你标记为C++,试试这个:

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

std::string将根据需要动态扩展。

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

比读取字符数组安全得多。

最新更新