C 简单的程序结果是;“捣毁烟囱”;
我试图连接两个字符串,然后在UNIX环境中进行系统调用。程序执行我想要的操作,但终止时出现错误C 简单的程序结果是;“捣毁烟囱”;,c,C,我试图连接两个字符串,然后在UNIX环境中进行系统调用。程序执行我想要的操作,但终止时出现错误***检测到堆栈崩溃*** 为什么会这样 这是我的密码: main(int argc, const char* argv[]) { //Check if there is an arg otehr than file name if(argc > 1) { int i; //argv[0] is prog name start at 1.
***检测到堆栈崩溃***
为什么会这样
这是我的密码:
main(int argc, const char* argv[])
{
//Check if there is an arg otehr than file name
if(argc > 1)
{
int i;
//argv[0] is prog name start at 1.
for(i=1; i<argc; i++)
{
char st1[] = "wc -l ";
strcat(st1, argv[i]);
printf("%s",system(st1));
}
}
else
{
printf("\nExiting. No input files given.\n");
}
return 0;
}
main(int-argc,const-char*argv[])
{
//检查是否有大于文件名的参数
如果(argc>1)
{
int i;
//argv[0]是从1开始的程序名。
for(i=1;istr1
不够大,无法包含结果字符串,因为它只有足够的元素来包含wc-l\0
(它是一个char[7]
数组)。对strcat()
的调用写入的内容超出了数组的边界,覆盖了不应该覆盖的内存
根据传入参数的长度动态分配足够的空间,以确保有足够的内存可用:
char* s = malloc(7 + strlen(argv[i])); /* 7 is 6 for "wc -l " and null term. */
if (s)
{
sprintf(s, "wc -l %s", argv[i]);
free(s);
}
st1
将被分配到堆栈上,刚好足够用于初始化它的字符串常量。然后您可能(几乎肯定)附加另一个字符串破坏书堆。听起来很顽皮……问题很明显。你在捣毁书堆!这个问题本应该是一本书能够回答的。我们的时间最好用在那些已经读过书、成功完成了练习但仍有问题的人身上。你在读哪本书?@modifiablelvalue,50度…@modifiablevalue我不是在读一本书。我只是在写程序,当我有了新的想法并通过网络学习时,他们会来找我。我不认为这与stackoverflow无关。如果你认为这是浪费时间,那么不要回答或标记它。@Nick如果你需要问stackoverflow这个代码有什么问题,那么你当前的学习的方法显然是行不通的。你如何确保你的C程序在未来的系统中能继续正常工作,这些系统与现在的系统有着无法想象的不同?未定义行为的问题是,在编译器或系统出现毫无意义的更新之前,它可能会按照预期工作。我建议K&R的“C编程语言,第二版”。
char st1[] = "wc -l ";
strcat(st1, argv[i]);