使用用户输入在运行时初始化char *

时间:2012-10-07 12:59:48

标签: c

我知道这是可能的

char text[A_BIG_NUMBER];
printf("Enter your name");
scanf("%s",text);

但是有办法做到这一点吗? (不使用char数组作为备份)

char* text;
printf("Enter your name");
scanf("%s",text);

虽然第一种方法很简单但是如果A_BIG_NUMBER不足以容纳用户输入的字符串,那么它将为其余代码创建问题,另一方面如果我们使用大数字则会浪费内存!< / p>

由于

编辑:抱歉标签错误。我只询问C。

5 个答案:

答案 0 :(得分:3)

既然你说的是C ++,答案就是“是的,字符串”:

std::string name;

std::cout << "Enter your name: ";

if (!std::getline(std::cin, name)) { /* unexpected end of input */ }

// now use "name"

正如您所发现的,您通常需要动态分配来存储外部数据。 (您的代码不是很通用:您不能拥有非常大的自动数组,并且固定大小会添加任意幻数和约束。)C ++是封装动态分配细节的完美语言< em>和cleanup ,这样您就可以使用简单的自动变量为您完成所有工作。

如果你不喜欢iostream,你可以设置自己的重载bool getline(std::FILE *, std::string &),它会循环调用std::fgets+=来提取完整​​的一行。

答案 1 :(得分:1)

你当然可以使用动态分配的内存而不是数组,但是溢出的根本问题仍然存在:

char *text = malloc(A_BIG_NUMBER*sizeof(char));
printf("Enter your name");
scanf("%s",text);

您需要告诉scanf空间有限,如下所示:

char text[201];
printf("Enter your name");
scanf("%200s",text);

请注意,text[201]为终结符提供了额外的字符空间:%200s将输入限制为200&#34; real&#34;字符,因此您需要为char提供额外的'\0'

答案 2 :(得分:1)

char *不分配用于存储用户输入字符串的内存,这就是第二个代码不起作用的原因。

如果您担心内存使用/浪费,可以使用特定于程序的堆栈/堆来克服这些限制。

答案 3 :(得分:0)

在循环中使用带有fgets()的小(ish)缓冲区。在循环内部realloc()是最终目的地。

/* UNTESTED */
char smallish[1000];
char *destin = NULL;
size_t destin_size = 1;
while (fgets(smallish, sizeof smallish, stdin)) {
    destin_size += strlen(smallish);
    char *tmp = realloc(destin, destin_size);
    if (!tmp) /* deal with error */;
    destin = tmp;
    strcat(destin, smallish);
    if (smallish[strlen(smallish) - 1] == '\n') break;
}
/* use destin */
free(destin);

答案 4 :(得分:0)

您可以使用getchar,这是一个示例代码:

  int size = 128;
  char *s = (char*)malloc (size);
  char c;
  int i;
  while ((c = getchar ()) != '\n' && c != EOF)
    {
      s[i] = c;
      ++i;
      if (i == size)
        {
          size = size * 2;
          char *tmp = realloc (s, size);
          if (tmp != NULL)
            s = tmp;
          else ; // error, try with malloc and copy or exit or whatever you want
        }
    }
  s[i] = 0;