c - 在不知道字符串大小的情况下动态提示输入字符串

标签 c dynamic prompt c-strings

在 C 中,如果我们不能提示字符串长度,那么提示和存储字符串的最佳方式是什么而不浪费空间。例如,通常我会做类似下面的事情......

char fname[30];
char lname[30];

printf("Type first name:\n");
scanf("%s", fname);

printf("Type last name:\n");
scanf("%s", lname); 

printf("Your name is: %s %s\n", fname, lname);

但是,我对必须使用比需要更多的空间这一事实感到恼火,所以我不想使用 char fname[30],而是动态分配字符串的大小.有什么想法吗?

最佳答案

您可以创建一个函数,在用户键入时为输入动态分配内存,使用 getchar() 一次读取一个字符。

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

void* safeRealloc(void* ptr, size_t size) {
  void *newPtr = realloc(ptr, size);
  if (newPtr == NULL) { // if out of memory
    free(ptr); // the memory block at ptr is not deallocated by realloc
  }
  return newPtr;
}

char* allocFromStdin(void) {
  int size = 32; // initial str size to store input
  char* str = malloc(size*sizeof(char));
  if (str == NULL) {
    return NULL; // out of memory
  }
  char c = '\0';
  int i = 0;
  do {
    c = getchar();
    if (c == '\r' || c == '\n') {
        c = '\0'; // end str if user hits <enter>
    }
    if (i == size) {
        size *= 2; // duplicate str size
        str = safeRealloc(str, size*sizeof(char)); // and reallocate it
        if (str == NULL) {
          return NULL; // out of memory
        }
    }
    str[i++] = c;
  } while (c != '\0');
  str = safeRealloc(str, i); // trim memory to the str content size
  return str;
}

int main(void) {
  puts("Type first name:\n");
  char* fname = allocFromStdin();

  puts("Type last name:\n");
  char* lname = allocFromStdin();

  printf("Your name is: %s %s\n", fname, lname);

  free(fname); // free memory afterwards
  free(lname); // for both pointers
  return 0;
}

关于c - 在不知道字符串大小的情况下动态提示输入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233730/

相关文章:

mysql - 遍历列并在 MySQL 中的每列上运行频率(计数*)

java - 非常简单的 Java 动态转换

创建类似函数的宏

android - 支持多种屏幕尺寸的文本

c - Windows 上的 malloc

Android微调器提示不起作用

command - Java jar-Archive 工具 - 设置包含内容的文件夹的路径

javascript - 如何在提示窗口中区分null和空字符串?

c++ - 一个根据一组编码标准检查 C/C++ 源代码的免费工具?

c - 如何在命令提示符下通过 C 文件运行输入 txt 文件到输出 txt 文件?