【问题标题】:using strlen to find length of user input c [closed]使用 strlen 查找用户输入 c 的长度 [关闭]
【发布时间】:2016-04-15 17:04:00
【问题描述】:

我正在尝试创建一个数组来存储用户的输入,并且我需要该数组是用户输入的确切长度。我想取用户输入的长度,并将其用作数组的长度。我怎么能用strlen做到这一点?有没有更好的办法?

【问题讨论】:

  • malloc 体积小,realloc 需要更多内存。
  • 为什么你需要数组是输入的确切长度?
  • 为什么是 strlen ?你想达到什么目的?该数组应该包含什么?数字?字母?编辑您的问题并更具体
  • 更重要的是,您允许二进制输入还是只允许一般文本? 1)分配合理的尺寸; 2)读取输入并存储它; 3) 需要比分配更多的空间? 4) 是,然后重新分配; 5) 不,完成。 - 最终你可以计算你读了多少字节并重新分配缓冲区(缩小它)以适应这个数量。

标签: c arrays string input strlen


【解决方案1】:

这是根据需要获取内存的一种方法。我会使用CHUNKSIZE 而不是4,但我限制了它以便于测试。

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

#define CHUNKSIZE   4

int main(void){
    char *text;
    int maxlen = CHUNKSIZE;
    int index = 0;
    int ch;

    text = malloc(CHUNKSIZE);
    if(text == NULL)
        exit(1);
    printf("Enter your text:\n");

    while((ch = getchar()) != EOF && ch != '\n') {
        text[index++] = ch;
        if (index >= maxlen) {
            maxlen += CHUNKSIZE;
            text = realloc(text, maxlen);   
            if(text == NULL)
                exit(1);
        }
    }
    text[index] = 0;                // terminate

    printf("%d You entered: %s\n", maxlen, text);
    free(text);    
    return 0;
}

节目环节:

Enter your text:
A quick brown fox jumps over the lazy dog.
You entered: A quick brown fox jumps over the lazy dog.

【讨论】:

  • 吹毛求疵:maxlenindex 至少应该是 size_tunsigned
  • @alk 同意,并且在适当的程序中,realloc 的结果应该在丢失原始值之前进行测试。
  • 同样使用 do-while 循环会使第一次调用 malloc() 变得不必要。但是,您得到了我的 1+ ... ;-)
  • @alk 谢谢,但提供*text = NULL 作为初始化。
  • @alk 我是这样做的,因为在循环之后即使没有输入也会写入'\0'
【解决方案2】:

在编写自己的函数之前,可以尝试以下代码:

char *str;
scanf("%ms", &str); // <--- Note the & before str

// Do something with str...

free(str);

这是对 ISO C 标准 supported on all POSIX.1-2008-conforming systems 的扩展。

【讨论】:

    猜你喜欢
    • 2013-02-01
    • 2012-01-20
    • 1970-01-01
    • 2015-02-23
    • 2011-12-14
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多