我正在做一个家庭作业,要求我将一个给定的文本复制到控制台中,该文本由多个行组成,每个行都有我需要分析的数据。无论如何问题是当我选择文本并将其粘贴到控制台时,控制台关闭。问题只发生在我尝试粘贴多行时。经过一些测试,我尝试粘贴的任何文本都超过了。
我在C中工作,我正在尝试将其存储到字符串中:
int main()
{
char text[1000];
gets(text);
printf("%s",text);
return 0;
}
例如,如果我尝试粘贴:
8C TS KC 9H 4S 7D 2S 5D 3S AC
它正常工作
但如果我尝试粘贴:
8C TS KC 9H 4S 7D 2S 5D 3S AC
5C AD 5D AC 9C 7C 5H 8D TD KS
它关闭了控制台。我很好奇为什么会这样做。
答案 0 :(得分:0)
首先:不要使用gets
,这个功能不安全,因为它没有
防止缓冲区溢出。如果输入超过999个字符,您将拥有
缓冲区溢出。请改用fgets
。
您所描述的是关于您的终端的事情,而不是C 语言。你在使用哪个终端?
根据选择的文字数量(例如,您选择多行),
如果您粘贴,也会复制新行('\n'
)
在你的终端上,粘贴的新行就像你按下了ENTER一样,
输入行(gets()
返回),printf
在终端上打印行,然后程序结束。
根据您打开终端的方式,终端也可能立即关闭
程序结束后。
这与C无关,但是如何使用终端。
修改强>
我从标题中监督您正在使用Codeblock IDE,对吧?如果 单击运行,然后打开控制台并执行程序。 大多数情况下,标准设置是控制台立即关闭 程序结束后。我不知道你是否可以改变这些设置 代码块配置(例如"在退出&#34时不要关闭终端;)。如果 你不能改变这种配置,你可以这样结束你的程序,所以 该终端不会立即关闭:
#include <stdio.h>
int main(void)
{
// your progam here
printf("Press ENTER to end");
getchar();
return 0;
}
我个人不喜欢这样,控制台上的程序不应该这样做 (除非出于某种原因需要)。更好的是你 打开终端,转到已编译程序的目录并执行 它自己。因此,当程序结束时,终端保持活跃状态。
答案 1 :(得分:0)
如前所述,请勿使用gets
,因为它不会阻止缓冲区溢出攻击。
您的终端关闭,因为您的程序等到用户发送新行后,gets
将新行前的字符读入您的text
数组并打印printf
该数组和您的程序完成并关闭控制台,如果它是由程序打开而不是由您或其他程序打开。
如果要输入多行并在给定输入上执行任务,只需使用循环。这是一个简单的例子:
#include <stdio.h>
int main(int argc, char** argv) {
char text[100];
printf("Write something:\n");
do {
fgets(text, 100,stdin);
/* do something with input */
printf("%s", text);
} while(text[0] != '!');
/* this will run until user writes an exclamation mark in the
beginning of the text */
return 0;
}