C 请批评我的代码,试图从stdin捕获无限的输入

C 请批评我的代码,试图从stdin捕获无限的输入,c,input,char,dynamic-memory-allocation,C,Input,Char,Dynamic Memory Allocation,所以这段代码有时会工作,有时会抛出一个“不可能发生的”错误。据我所知,这似乎是由于我在解析字符串时重新分配内存的方式造成的 char* unlimInput() { char* input; int counter = 0; int buffer = 16; char c; do { c = getchar(); if (counter +2 >= buffer) { int newSize = buffer * 2;

所以这段代码有时会工作,有时会抛出一个“不可能发生的”错误。据我所知,这似乎是由于我在解析字符串时重新分配内存的方式造成的

char* unlimInput() {
   char* input;
   int counter = 0;
   int buffer = 16;
   char c;
   do {
      c = getchar();
      if (counter +2 >= buffer) {
         int newSize = buffer * 2;
         char* newString = realloc(input, newSize);
         newString[counter] = c;
         buffer = newSize;
         input = newString;
      } else {
         input[counter] = c;
      }
      counter += 1;
   } while (c != '\n');
   return input;
}

我一直在努力理解动态内存分配,因此任何指针(没有双关语)都会受到欢迎。

您的代码是可靠的。干得好您只是忘了在字符串的末尾添加空分隔符。在getchar()函数之后编写这行代码:

然后返回一个有效字符串


我希望我的回答对你有帮助。快乐编码

您的代码是可靠的。干得好您只是忘了在字符串的末尾添加空分隔符。在getchar()函数之后编写这行代码:

然后返回一个有效字符串



我希望我的回答对你有帮助。快乐编码

确保用您正在使用的编程语言标记您的问题。@JohnMontgomery My bad,现已修复。您得到的确切错误是什么?请不要近似。您在这里无缘无故地使用了大量一次性变量
buffer*=2
input=realloc(input,buffer)
应该完成这项工作,假设您不关心分配失败。有几个注意事项。首先,您无法返回长度,因此调用者需要再次扫描
'\0'
。您必须检查每个分配的返回。您必须处理
EOF
——否则,在遇到
EOF
后,您会继续旋转寻找
'\n'
。在这个答案中,我们需要考虑几个额外的因素。(请注意,如果没有提供文件名作为参数,则默认情况下代码读取自
stdin
),请确保使用您正在使用的编程语言标记您的问题。@JohnMontgomery My bad,现已修复。您得到的确切错误是什么?请不要近似。您在这里无缘无故地使用了大量一次性变量
buffer*=2
input=realloc(input,buffer)
应该完成这项工作,假设您不关心分配失败。有几个注意事项。首先,您无法返回长度,因此调用者需要再次扫描
'\0'
。您必须检查每个分配的返回。您必须处理
EOF
——否则,在遇到
EOF
后,您会继续旋转寻找
'\n'
。在这个答案中,我们需要考虑几个额外的因素。(请注意,如果没有提供文件名作为参数,则默认情况下代码从
stdin
读取)您可以修复现有的问题,然后
@notify
向下投票人(在本例中是我),这样他们就可以删除向下投票。@HolyBlackCat是的,我刚检查过…你不需要石膏。所以我认为有必要投反对票。不过还是要谢谢你:)那就考虑修改答案吧。:)@HolyBlackCat这么好吗?@HolyBlackCat谢谢,这意味着很多。与其重新发布答案以消除反对票(甚至不解决其中的问题!),不如修复现有的答案,然后
@notify
通知反对票者(在本例中是我),这样他们就可以删除他们的反对票。@HolyBlackCat是的,我刚检查过…你不需要石膏。所以我认为有必要投反对票。不过还是要谢谢你:)那就考虑修改答案吧。:)@HolyBlackCat这样好吗?@HolyBlackCat谢谢,意义重大。
*(input+counter)='\0';