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

示爱

在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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在不知道输入大小的情况下对字符串向量进行排序c ++

来自分类Dev

在不知道字符串长度的情况下查找字符串的子字符串

来自分类Dev

如何在不知道分割字符先验的情况下分割字符串?

来自分类Dev

如何在不知道变量名称的情况下读取查询字符串?

来自分类Dev

Swift 3:在不知道 indexPath 的情况下从数组中删除特定字符串?

来自分类Dev

如何在不知道字符串格式的情况下将字符串转换为日期

来自分类Dev

您可以在不知道随机字符串是否包含特殊字符的情况下引用随机字符串吗?

来自分类Dev

在不知道名称的情况下在内部设置字符串值

来自分类Dev

在不知道列的情况下在表中搜索字符串

来自分类Dev

我可以在不知道连接字符串的情况下使用数据库项目管理数据库吗?

来自分类Dev

如果我们不知道字符串的大小并且无法动态分配内存,是否可以使用sscanf标记字符串?

来自分类Dev

我不知道如何设置字符串路径

来自分类Dev

我不知道为什么不能像 Solidity 那样分配字符串大小

来自分类Dev

输入的字符串格式不正确,但不知道为什么

来自分类Dev

我不知道如何将用户输入作为字符串处理

来自分类Dev

在不知道数组大小的情况下输入数组

来自分类Dev

如何在不知道长度的情况下在C中初始化字符串,并继续向其附加字符?

来自分类Dev

字符串索引超出范围:2不知道为什么会出现这种情况

来自分类Dev

在知道字符串的一部分的情况下查找字符串并返回字符串

来自分类Dev

如何在索引未知的情况下动态更改长文本的字符串的子字符串

来自分类Dev

动态分配-用户在运行时不知道数组大小的情况下输入元素

来自分类Dev

如何在不知道原始数组大小的情况下增加动态数组(C ++)的大小?

来自分类Dev

我不知道如何记录/信息LazySeq的字符串值

来自分类Dev

试图引用“ this”引用当前字符串对象。不知道我是否做对了

来自分类Dev

不知道这是否有可能,请在字符串sql变量中使用if语句

来自分类Dev

不知道如何在Powershell中将数组转换为字符串

来自分类Dev

迅捷:方法不知道它接受一个字符串

来自分类Dev

我不知道为什么我的字符串不能保存值

来自分类Dev

php ctype_digit 不知道字符串是否为数字

Related 相关文章

  1. 1

    在不知道输入大小的情况下对字符串向量进行排序c ++

  2. 2

    在不知道字符串长度的情况下查找字符串的子字符串

  3. 3

    如何在不知道分割字符先验的情况下分割字符串?

  4. 4

    如何在不知道变量名称的情况下读取查询字符串?

  5. 5

    Swift 3:在不知道 indexPath 的情况下从数组中删除特定字符串?

  6. 6

    如何在不知道字符串格式的情况下将字符串转换为日期

  7. 7

    您可以在不知道随机字符串是否包含特殊字符的情况下引用随机字符串吗?

  8. 8

    在不知道名称的情况下在内部设置字符串值

  9. 9

    在不知道列的情况下在表中搜索字符串

  10. 10

    我可以在不知道连接字符串的情况下使用数据库项目管理数据库吗?

  11. 11

    如果我们不知道字符串的大小并且无法动态分配内存,是否可以使用sscanf标记字符串?

  12. 12

    我不知道如何设置字符串路径

  13. 13

    我不知道为什么不能像 Solidity 那样分配字符串大小

  14. 14

    输入的字符串格式不正确,但不知道为什么

  15. 15

    我不知道如何将用户输入作为字符串处理

  16. 16

    在不知道数组大小的情况下输入数组

  17. 17

    如何在不知道长度的情况下在C中初始化字符串,并继续向其附加字符?

  18. 18

    字符串索引超出范围:2不知道为什么会出现这种情况

  19. 19

    在知道字符串的一部分的情况下查找字符串并返回字符串

  20. 20

    如何在索引未知的情况下动态更改长文本的字符串的子字符串

  21. 21

    动态分配-用户在运行时不知道数组大小的情况下输入元素

  22. 22

    如何在不知道原始数组大小的情况下增加动态数组(C ++)的大小?

  23. 23

    我不知道如何记录/信息LazySeq的字符串值

  24. 24

    试图引用“ this”引用当前字符串对象。不知道我是否做对了

  25. 25

    不知道这是否有可能,请在字符串sql变量中使用if语句

  26. 26

    不知道如何在Powershell中将数组转换为字符串

  27. 27

    迅捷:方法不知道它接受一个字符串

  28. 28

    我不知道为什么我的字符串不能保存值

  29. 29

    php ctype_digit 不知道字符串是否为数字

热门标签

归档