加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何输入未知大小的字符串

发布时间:2020-12-16 03:44:33 所属栏目:百科 来源:网络整理
导读:我对C中的字符串有点困惑.我理解声明缓冲区大小很重要,否则会导致缓冲区溢出.但我需要知道如何获取一个我不知道其大小的字符串输入.例如,如果我想从用户那里获取一行文本作为输入,而我无法知道他们的文本有多长,我该怎么做呢? 我尝试在用户提供输入时动态分
我对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] = '';
    printf("%sn",str);
    free(str);
}

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

source.c(10): warning C4473: ‘scanf_s’ : not enough arguments passed
for format string

source.c(10): note: placeholders and their parameters expect 2
variadic arguments,but 1 were provided

source.c(10): note: the missing variadic argument 2 is required by
format string ‘%c’

source.c(10): note: this argument is used as a buffer size

我认为动态分配内存(如上面的代码)应该可行,但我可能做错了.有没有办法让这项工作?

编辑:Word.

解决方法

>你应该使用getchar而不是scanf_s
>你应该使用int ch;不是char;对于EOF

以下代码可以工作:

#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] = '';
        printf("%sn",str);
        free(str);
    }

    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读