【发布时间】:2014-10-13 19:27:29
【问题描述】:
我有以下代码用于通过终端提示从用户那里获取字符串:
#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 的破坏性误解,从我从朋友/在线文章中听到的。
*****我已根据 cmets 中提供的帮助和下面的答案将上面的代码修改为更好的状态。我愿意对此进行进一步改进,并希望此示例可以帮助其他试图更好地了解如何以安全有效的方式处理用户输入的人。******
#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;
}
【问题讨论】:
-
代码看起来不错,但内存管理很糟糕(每个附加字符都会重新分配)。对初始缓冲区大小和增量(双缓冲区大小)做出一些合理的假设。最后,您可能会进行浪费的缓冲区(重新)分配并缩小缓冲区。
-
SO 不是代码审查的地方。这个问题及其答案是不可搜索的,也无助于丰富 SO 的宝藏。它对其他读者没有用。
-
我很抱歉。我认为这是形成关于 SO 的问题的好方法。您知道有没有更好的地方可以发布此类问题?
-
@AnthonyHopkins:有一些问题对 SO 数据库的“丰富”程度要低得多(这个问题还不错)
-
@AnthonyHopkins 您的原始问题很好,请避免对答案做出反应并调整问题。 (不过,您可以更改标题)