我是 C 编程的新手。我正在上课,我必须:
程序将从标准输入中获取所有输入,可能对其进行转换,然后将其输出到标准输出。
程序将逐行读入输入。每行都将进行转换(如果有的话)。然后打印出变换后的行。
您必须从用户处读取,直到不再有文字为止。可以在终端中键入Ctrl + D以指示没有文本。
我不是一个正在寻找为我做的答案的学生,但我完全迷失在这里。我试着用:
char*buf = NULL;
while (fscanf(stdin, "%ms", &buf) > 0)
{ do transform }
但我没有运气。所以任何帮助都表示赞赏。我也不知道 Ctrl + D 部分。
答案 0 :(得分:4)
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
}
答案 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
函数将读取,直到读取行尾字符。
比读入字符数组更安全。