我知道这是可能的
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。
答案 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;