繁体   English   中英

如何读取和输出带有空格和换行符的输入

[英]How to read & output an input with spaces and newlines

我正在尝试在C中扫描多行输入并将其输出。 但是,我在处理空格和换行符时遇到麻烦。 如果输入是:

Hello.
My name is John.
Pleased to meet you!

我想输出所有三行。 但是我的输出最终只是:

Hello.

这是我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() 
{
    char s[100];
    scanf("%[^\n]%*c", &s);
    printf(s);
    return 0;
}

使用fgets()更容易:

#include <stdio.h>

int main(void)
{
    char buffer[1000];
    while (fgets(buffer, sizeof(buffer), stdin) && buffer[0] != '\n') {
        printf("%s", buffer);
    }
}

空行(第一个字符是换行符)结束输入。


如果必须在打印结果之前先读取所有输入,则情况会变得有些复杂:

#include <stddef.h>  // size_t
#include <stdlib.h>  // EXIT_FAILURE, realloc(), free()
#include <stdio.h>   // fgets(), puts()
#include <string.h>  // strlen(), strcpy()

int main(void)
{
    char buffer[1000];
    char *text = NULL;  // pointer to memory that will contain the whole text
    size_t total_length = 0;  // keep track of where to copy our buffer to

    while (fgets(buffer, sizeof(buffer), stdin) && buffer[0] != '\n') {
        size_t length = strlen(buffer);  // remember so we don't have to call
                                         // strlen() twice.
        // (re)allocate memory to copy the buffer to:
        char *new_text = realloc(text, total_length + length + 1); // + 1 for the
        if (!new_text) {  // if (re)allocation failed              terminating '\0'
            free(text);   // clean up our mess
            fputs("Not enough memory :(\n\n", stderr);                   
            return EXIT_FAILURE;
        }
        text = new_text;  // now its safe to discard the old pointer
        strcpy(text + total_length, buffer);  // strcpy instead of strcat so we don't
        total_length += length;               // have to care about uninitialized memory 
    }                                         // on the first pass *)

    puts(text);  // print all of it
    free(text);  // never forget
}

*),而且效率更高,因为strcat()必须在附加新字符串之前找到text的结尾。 我们已经拥有的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM