首页 > 解决方案 > 如何输入大小未知的字符串

问题描述

我对 C 中的字符串有点困惑。我知道声明缓冲区大小很重要,否则会导致缓冲区溢出。但我需要知道如何获取我不知道大小的字符串输入。例如,如果我想从用户那里获取一行文本作为输入,但我无法知道他们的文本有多长,我该怎么做?

我尝试在用户输入时动态分配内存。这是代码-

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

int main()
{
    char *str, ch;
    int size = 10, len = 0;
    str = realloc(NULL, sizeof(char)*size);
    if (!str)return str;
    while (EOF != scanf_s("%c", &ch) && ch != '\n')
    {
        str[len++] = ch;
        if (len == size)
        {
            str = realloc(str, sizeof(char)*(size += 10));
            if (!str)return str;
        }
    }
    str[len] = '\0';
    printf("%s\n", str);
    free(str);
}

问题是,当我使用 VS-2017 编译它时,我得到了这些错误-

source.c(10):警告 C4473:“scanf_s”:为格式字符串传递的参数不足

source.c(10):注意:占位符及其参数需要 2 个可变参数,但提供了 1 个

source.c(10):注意:格式字符串 '%c' 需要缺少的可变参数 2

source.c(10):注意:此参数用作缓冲区大小

我认为在我继续进行时动态分配内存(如上面的代码)应该可以工作,但我可能做错了什么。有没有办法使这项工作?

编辑:字。

标签: cvisual-studio-2017scanf

解决方案


  1. getchar你不应该使用scanf_s
  2. 你不int ch;应该char ch;使用EOF

以下code可以工作:

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

int main() {
    char *str = NULL;
    int ch;
    size_t size = 0, len = 0;

    while ((ch=getchar()) != EOF && ch != '\n') {
        if (len + 1 >= size)
        {
            size = size * 2 + 1;
            str = realloc(str, sizeof(char)*size);
        }
        str[len++] = ch;
    }
    if (str != NULL) {
        str[len] = '\0';
        printf("%s\n", str);
        free(str);
    }

    return 0;
}

推荐阅读