代码块,粘贴cosole中的文本将其关闭

时间:2018-01-06 15:25:31

标签: c codeblocks

我正在做一个家庭作业,要求我将一个给定的文本复制到控制台中,该文本由多个行组成,每个行都有我需要分析的数据。无论如何问题是当我选择文本并将其粘贴到控制台时,控制台关闭。问题只发生在我尝试粘贴多行时。经过一些测试,我尝试粘贴的任何文本都超过了。
我在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

它关闭了控制台。我很好奇为什么会这样做。

2 个答案:

答案 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;
}