用于从用户输入中检索字符串的 c 函数存在内存问题

标签 c string input

我使用以下代码通过终端提示从用户那里获取字符串:

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

void GetString(int*, int*);

int main(void)
{
    unsigned int strLength = 32;
    char *stringPtr = malloc(strLength);
    printf("Enter some input: ");
    if (stringPtr != NULL)
    {
        int c = EOF;
        unsigned int i = 0;
        while ((c = getchar()) != '\n' && c != EOF)
        {
            stringPtr[i++] = (char) c;
            if (i == strLength)
            {
                strLength = i+strLength;
                if(stringPtr = realloc(stringPtr, strLength))
            }
        }
        stringPtr[i] = '\0';
        printf("\n\nString value: %s\n\n", stringPtr);
        free(stringPtr);
        stringPtr = NULL;
    }
}

从用户的角度来看,它工作得很好,但是,我是新手,现在才真正开始理解指针如何相互协作,但是,我还没有在网上找到一个可以简单中继的很好的工作示例如何成功处理未知数量的输入而不用担心缓冲区溢出、段错误等。

我上面列出的代码是我使用与动态内存分配相关的几个示例以及一些关于字符串操作的论坛构建的。任何人都可以验证这是一种安全、有效的方式来处理未知长度的用户输入吗?如果不是,您能否提供有关我发布的内容为何不正确以及如何改进的信息?我只是想确保我正在正确地学习,因为我正在自学(大部分时间),这可能会导致在 C 方面非常具有破坏性的误解,这是我从 friend /在线文章中听到的。

*****我已经根据下面的评论和答案中提供的帮助将上面的代码修改为更好的状态。我愿意对此进行进一步改进,并希望这个示例可以帮助其他人更好地理解如何以安全有效的方式处理用户输入。******

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

void GetString(int*, int*);

int main(void)
{
    unsigned int strLength = 32;
    char *stringPtr = malloc(strLength);
    if (stringPtr == NULL)
    {
        fprintf(stderr, "Unable to allocate memory to hold char array. Exiting!\n");
        return 1;
    }
    printf("Enter some input: ");
    int c = EOF;
    unsigned int i = 0;
    while ((c = getchar()) != '\n' && c != EOF)
    {
        stringPtr[i++] = (char) c;
        if (i == strLength)
        {
            strLength += strLength;
            if ((stringPtr = realloc(stringPtr, strLength)) == NULL)
            {
                fprintf(stderr, "Unable to expand memory to hold char array. Exiting!\n");
                return 2;
            }
        }
    }
    stringPtr[i] = '\0';
    if (sizeof(stringPtr) < strLength)
    {
        stringPtr = realloc(stringPtr, strLength);
    }
    printf("\n\nString value: %s\n\n\n", stringPtr);
    free(stringPtr);
    stringPtr = NULL;
}

最佳答案

将此视为部分答案,希望稍后能提供更多提示。 以下是一些初步评论:

  1. 首先检查 malloc() 是否成功。否则无需提示。
  2. 如果 malloc() 失败,立即终止,您可以使用 exit(1) 或 return(1) 但如果您也先向 stderr 写入错误消息,例如使用 fprintf(stderr, "malloc failed! ");这样您就不必缩进 main() 函数的主要部分!
  3. 一次分配一个字节不是很有效。通常,您会以更大的步长递增,例如一次 80 个字节。
  4. 您的代码可能无法很好地处理退格键或 UNICODE。但我想现在讨论这个问题还为时过早。
  5. realloc() 可能会失败,但您永远不会检查它。

代码可以更高效(更短),但你有一个好的开始!

关于用于从用户输入中检索字符串的 c 函数存在内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26347451/

相关文章:

c - 创建 connect 4 board c 程序时出现段错误

c# - 判断一个字符串中的所有字符是否相同

python - 输入的错误最多为1个参数,为3

android - Ionic 3 输入框在首次加载时不可点击

javascript - 使用 Javascript 编辑输入字段的值

c++ - ASIC 设备的 OpenCL(或其他)编程?

用C不断调整数组的大小

C fprintf 程序输出 -1.#J 而不是实数

c - 如何从 C 中的字符串中去除文件扩展名?

c# - System.String 不会重载运算符 += 但字符串连接有效,如何?