0

我对如何实现这部分代码有点困惑。

我需要从用户那里读入一个最多 256 个字符的字符串。如果用户输入,该字符串还应包含任何间距和换行符。当用户"."自己输入时,它会告诉程序输入完成。输入完成后,程序以相同的间距和换行符吐出完全相同的字符串。

例如:

Please enter a string: This is just a test.
The input has not ended yet.
It will end when the user enters just a period.
.

程序回报:

This is just a test.
The input has not ended yet.
It will end when the user enters just a period.

到目前为止,我能想到的唯一方法是使用fgets(),但我不太确定如何在使用".". 我在想可能是一个持续检查的while循环?

任何帮助,将不胜感激。谢谢!

4

1 回答 1

1

这个想法是使用一个缓冲区,每次有新数据进入时都会重新分配它,并跟踪它的大小:

char* data = NULL;
size_t size = 0;

你的假设是正确的,你需要一个循环。像这样的东西:

int end = 0;
while (!end) {
    char buf[512];
    if (fgets(buf, sizeof buf, stdin) == NULL) {
        // an error occured, you probably should abort the program
    }
}

您必须检查缓冲区是否实际上是您要结束数据输入的令牌:

if (strcmp(buf, ".\n") == 0) {
    // end loop
}

如果找不到令牌,您将需要重新分配数据缓冲区,将其延长您刚刚读取的字符串的长度:

size_t len = strlen(buf);
char* tmp = realloc(data, size + len + 1);   // ... plus the null terminator
if (tmp == NULL) {
    // handle your allocation failure
}

...并在最后复制新内容:

data = tmp;
memcpy(data + size, buf, len);
size += len;
data[size] = '\0';                           // don't forget the null terminator

完成后,输出并清理:

printf("%s", data);
free(data);

填空,组装,你就会有一个工作的、安全的程序,它可以满足你的要求。

于 2012-09-15T18:25:36.227 回答