我是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)
有以下问题。
-
buf
不指向可以读取和存储输入的任何有效内容。 -
%ms
不是标准的 C 格式说明符(在 POSIX 标准兼容平台中受支持,感谢@JonathanLeffler(。 - 最好使用
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
函数将读取,直到读取行尾字符。
比读取字符数组安全得多。