繁体   English   中英

从用户读取未知长度的字符串(一次工作并停止)

[英]Reading a string of unknown length from user (works once and stops)

这是我的代码:

char* get_string()
{
    #define MAX_STRING_LENGTH 1000
    char *input=NULL;
    char  buffer[MAX_STRING_LENGTH];

        fgets(buffer,MAX_STRING_LENGTH,stdin);
        fflush(stdin);
        if((input=realloc(input,strlen(buffer)))==NULL)
        {
            printf("Error allocating memory for string.");
            return NULL;
        }
        strncpy(input,buffer,sizeof(buffer));

    return input;
}

我第一次调用该函数是正常的,第二次它将返回垃圾,程序存在一些错误。

好的,按照我编辑代码的建议:

char* get_string()
{
    #define MAX_STRING_LENGTH 1000
    char *input=NULL;
    char  buffer[MAX_STRING_LENGTH];

        if(fgets(buffer,MAX_STRING_LENGTH,stdin)==NULL)
        {
            printf("Error reading string.");
            return NULL;
        }
        if((input=malloc(strlen(buffer)+1))==NULL)
        {
            printf("Error allocating memory for string.");
            return NULL;
        }
        strncpy(input,buffer,sizeof(input));

    return input;
}

主要是我有:

while(1)
{
tmp_arr_ptr=get_string();
printf("%s",tmp_arr_ptr);
}

但是我看到了和以前一样的行为。

UPDATE - 更改为strcpy(输入,缓冲区); 现在它工作正常!

  1. 你的realloc应该是strlen(buffer)+1以容纳字符串末尾的NUL

  2. 虽然它在这里是无害的,但你的strncpy应该设置要复制到目标缓冲区大小的最大字节数,而不是源缓冲区的大小。

  3. fflush(stdin)是未定义的行为 - 请参阅fflush(stdin)ANSI C

  4. 如果之前input始终为NULL ,为什么还要重新realloc 只需使用malloc() 或者干脆更好strdup缓冲区。

  5. 检查fgets的返回值是否为NULL

由于终止NULL您正在覆盖缓冲区的末尾。 您需要分配strlen(buffer) + 1个字节。 因为你已经知道你已经分配了足够的空间,所以不需要strncpy()

更多想法: realloc()为此目的很尴尬。 首先,它保留了原始缓冲区的内容,这可能意味着不必要的副本。 除非字符串比前一个更长,否则无需重新分配 - 您可以重用缓冲区。

暂无
暂无

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

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