代码块,在控制台中粘贴文本将其关闭
codeblocks, pasting a text in the cosole closes it
我正在做一项作业,要求我将给定的文本复制粘贴到控制台中,该文本由多行组成,每行都有我需要分析的数据。无论如何,问题是当我 select 文本并将其粘贴到控制台时,控制台 closes.The 问题仅在我尝试粘贴多于 1 行时出现。经过一些测试,我尝试粘贴的任何文本都超过了。
我在 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
它会关闭 console.I 我很好奇为什么会这样。
首先:不要使用gets
,这个函数不安全,因为它不
防止缓冲区溢出。如果您输入超过 999 个字符,您将获得
缓冲区溢出。请改用 fgets
。
你所描述的是关于你的终端的东西,而不是 C
语言。您使用的是哪个终端?
取决于 select 编辑了多少文本(例如,您 select 不止一行),
如果您粘贴,也会复制一个新行 ('\n'
)
在您的终端上,粘贴的新行就好像您按下了 ENTER 键一样,
输入该行 (gets()
returns),printf
在终端上打印该行,然后程序结束。
根据您打开终端的方式,终端也可能会立即关闭
程序关闭后。
这与 C 无关,而是与您如何使用终端有关。
编辑
我从标题中看到您正在使用 Codeblock IDE,对吗?如果
您单击 运行,然后将打开一个控制台并执行您的程序。
大多数时候,标准设置是控制台立即关闭
程序结束后。我不知道你是否可以在
代码块配置(类似于 "don't close terminal on exit")。如果
你不能改变这个配置,你可以这样结束你的程序,所以
该终端不会立即关闭:
#include <stdio.h>
int main(void)
{
// your progam here
printf("Press ENTER to end");
getchar();
return 0;
}
我个人不喜欢这样,控制台上的程序不应该那样做
(除非出于某种原因有必要)。更好的做法是 you
打开终端,转到编译程序的目录并执行
它自己。因此,当程序结束时,终端保持活动状态。
如前所述,请勿使用 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;
}
我正在做一项作业,要求我将给定的文本复制粘贴到控制台中,该文本由多行组成,每行都有我需要分析的数据。无论如何,问题是当我 select 文本并将其粘贴到控制台时,控制台 closes.The 问题仅在我尝试粘贴多于 1 行时出现。经过一些测试,我尝试粘贴的任何文本都超过了。
我在 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
它会关闭 console.I 我很好奇为什么会这样。
首先:不要使用gets
,这个函数不安全,因为它不
防止缓冲区溢出。如果您输入超过 999 个字符,您将获得
缓冲区溢出。请改用 fgets
。
你所描述的是关于你的终端的东西,而不是 C 语言。您使用的是哪个终端?
取决于 select 编辑了多少文本(例如,您 select 不止一行),
如果您粘贴,也会复制一个新行 ('\n'
)
在您的终端上,粘贴的新行就好像您按下了 ENTER 键一样,
输入该行 (gets()
returns),printf
在终端上打印该行,然后程序结束。
根据您打开终端的方式,终端也可能会立即关闭
程序关闭后。
这与 C 无关,而是与您如何使用终端有关。
编辑
我从标题中看到您正在使用 Codeblock IDE,对吗?如果 您单击 运行,然后将打开一个控制台并执行您的程序。 大多数时候,标准设置是控制台立即关闭 程序结束后。我不知道你是否可以在 代码块配置(类似于 "don't close terminal on exit")。如果 你不能改变这个配置,你可以这样结束你的程序,所以 该终端不会立即关闭:
#include <stdio.h>
int main(void)
{
// your progam here
printf("Press ENTER to end");
getchar();
return 0;
}
我个人不喜欢这样,控制台上的程序不应该那样做 (除非出于某种原因有必要)。更好的做法是 you 打开终端,转到编译程序的目录并执行 它自己。因此,当程序结束时,终端保持活动状态。
如前所述,请勿使用 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;
}