调用系统函数system(cmd),"echo '%s %s '>>reports.log"显示注释与时间戳出问题,不生成文件

jisj88 2018-10-27 08:34:28
程序源自《嗨翻C语言》P400
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char * now()
{
time_t t;
time(&t);
return asctime(localtime(&t));
}

int main()
{
char comment[80];
char cmd[120];
fgets(comment,80,stdin);
sprintf(cmd,"echo '%s %s' >> reports.log",comment,now());/*这里有什么问题?*/
system(cmd);

return 0;
}


问题:
1、为何不生成reports.log文件,输入C yuyanbianxie,命令行窗口显示'C yuyanbianxie


采用的工具是mingw编译器,编译未产生错误提醒,time函数也是可以正常使用的,求解
...全文
1844 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jisj88 2018-11-01
  • 打赏
  • 举报
回复
引用 16 楼 SXJIAKE 的回复:
[quote=引用 10 楼 jisj88 的回复:] [quote=引用 9 楼 ckc 的回复:] 在system(cmd)前加一句puts(cmd),检查一下字符串正常不正常
测试了,还是不行,帮我看下是哪里出问题了,运行结果如下: chongshiyici(这个是我的输入,下面是命令行的输出) echo 'chongshiyici Tue Oct 30 11:45:06 2018 ' >> reports.log 'chongshiyici -------------------------------- Process exited after 10.48 seconds with return value 0 请按任意键继续. . .[/quote] 很简单的问题,测试了你都没发现问题。 做有规模的程序还有很长的路要走,要有能力解决这种小问题。 我特意也去测试了这段代码,发现两个问题。如图: 1. Linux 上的如果你用引号引起来,则只有引号内的内容会输出,引号本身被忽略(图见2.1)。 Windows 的 echo 会对后面的内容原样输出,即任何单引号都会直接输出(图见2.2)。 2. 所有的字符串末尾都多出来一个换行符,这一点在你的输出中也有体现。 测试发现问题正在于此。就比如你的:
引用
echo 'chongshiyici Tue Oct 30 11:45:06 2018 ' >> reports.log
明显最后的命令由于两个字符串尾部都存在换行符,变成了三行。 那么不同的系统上就会出现不同情况: 2.1 如果在 Linux 上,这样的确是正常的。在 Linux shell 中,如果输入的命令中包含奇数个引号,则按下换行并不会执行,在遇到配对的结束引号之前,可以继续输入内容并换行。命令最终执行完成,输出所有引号范围内的内容。在 Ubuntu on Windows 上实测如下: 所以在 Linux 上执行,以上命令最终将三行内容:
引用
chongshiyici Tue Oct 30 11:45:06 2018
注意,包括末尾的空行也算一行,输出到文件中。 2.2 在 Windows 上,分解为三个独立的行来执行:
引用
echo 'chongshiyici Tue Oct 30 11:45:06 2018 ' >> reports.log
第一行:原样输出“'chongshiyici”; 第二行:“ Tue Oct 30 11:45:06 2018”找不到命令; 第三行“' >> reports.log”找不到命令。 因此,最终文件里什么都没有。[/quote] 谢谢解答,程序学习的道路还要学很多,要多动脑筋。
「已注销」 2018-11-01
  • 打赏
  • 举报
回复
引用 10 楼 jisj88 的回复:
[quote=引用 9 楼 ckc 的回复:]
在system(cmd)前加一句puts(cmd),检查一下字符串正常不正常


测试了,还是不行,帮我看下是哪里出问题了,运行结果如下:
chongshiyici(这个是我的输入,下面是命令行的输出)
echo 'chongshiyici
Tue Oct 30 11:45:06 2018
' >> reports.log
'chongshiyici

--------------------------------
Process exited after 10.48 seconds with return value 0
请按任意键继续. . .[/quote]
很简单的问题,测试了你都没发现问题。
做有规模的程序还有很长的路要走,要有能力解决这种小问题。

我特意也去测试了这段代码,发现两个问题。如图:

1. Linux 上的如果你用引号引起来,则只有引号内的内容会输出,引号本身被忽略(图见2.1)。
Windows 的 echo 会对后面的内容原样输出,即任何单引号都会直接输出(图见2.2)。
2. 所有的字符串末尾都多出来一个换行符,这一点在你的输出中也有体现。

测试发现问题正在于此。就比如你的:
引用
echo 'chongshiyici
Tue Oct 30 11:45:06 2018
' >> reports.log

明显最后的命令由于两个字符串尾部都存在换行符,变成了三行。

那么不同的系统上就会出现不同情况:
2.1 如果在 Linux 上,这样的确是正常的。在 Linux shell 中,如果输入的命令中包含奇数个引号,则按下换行并不会执行,在遇到配对的结束引号之前,可以继续输入内容并换行。命令最终执行完成,输出所有引号范围内的内容。在 Ubuntu on Windows 上实测如下:

所以在 Linux 上执行,以上命令最终将三行内容:
引用
chongshiyici
Tue Oct 30 11:45:06 2018

注意,包括末尾的空行也算一行,输出到文件中。

2.2 在 Windows 上,分解为三个独立的行来执行:
引用
echo 'chongshiyici
Tue Oct 30 11:45:06 2018
' >> reports.log
第一行:原样输出“'chongshiyici”;
第二行:“ Tue Oct 30 11:45:06 2018”找不到命令;
第三行“' >> reports.log”找不到命令。

因此,最终文件里什么都没有。
636f6c696e 2018-11-01
  • 打赏
  • 举报
回复
赞一个,到论坛来问问题的人真应该学学怎么分步解决诶问题 这种问题的确你直接问一个人都很难知道,但是你可以通过一些替代命令进行测试来找到答案
引用 16 楼 SXJIAKE 的回复:
[quote=引用 10 楼 jisj88 的回复:] [quote=引用 9 楼 ckc 的回复:] 在system(cmd)前加一句puts(cmd),检查一下字符串正常不正常
测试了,还是不行,帮我看下是哪里出问题了,运行结果如下: chongshiyici(这个是我的输入,下面是命令行的输出) echo 'chongshiyici Tue Oct 30 11:45:06 2018 ' >> reports.log 'chongshiyici -------------------------------- Process exited after 10.48 seconds with return value 0 请按任意键继续. . .[/quote] 很简单的问题,测试了你都没发现问题。 做有规模的程序还有很长的路要走,要有能力解决这种小问题。 我特意也去测试了这段代码,发现两个问题。如图: 1. Linux 上的如果你用引号引起来,则只有引号内的内容会输出,引号本身被忽略(图见2.1)。 Windows 的 echo 会对后面的内容原样输出,即任何单引号都会直接输出(图见2.2)。 2. 所有的字符串末尾都多出来一个换行符,这一点在你的输出中也有体现。 测试发现问题正在于此。就比如你的:
引用
echo 'chongshiyici Tue Oct 30 11:45:06 2018 ' >> reports.log
明显最后的命令由于两个字符串尾部都存在换行符,变成了三行。 那么不同的系统上就会出现不同情况: 2.1 如果在 Linux 上,这样的确是正常的。在 Linux shell 中,如果输入的命令中包含奇数个引号,则按下换行并不会执行,在遇到配对的结束引号之前,可以继续输入内容并换行。命令最终执行完成,输出所有引号范围内的内容。在 Ubuntu on Windows 上实测如下: 所以在 Linux 上执行,以上命令最终将三行内容:
引用
chongshiyici Tue Oct 30 11:45:06 2018
注意,包括末尾的空行也算一行,输出到文件中。 2.2 在 Windows 上,分解为三个独立的行来执行:
引用
echo 'chongshiyici Tue Oct 30 11:45:06 2018 ' >> reports.log
第一行:原样输出“'chongshiyici”; 第二行:“ Tue Oct 30 11:45:06 2018”找不到命令; 第三行“' >> reports.log”找不到命令。 因此,最终文件里什么都没有。[/quote]
jisj88 2018-10-30
  • 打赏
  • 举报
回复
引用 3 楼 cwhelucky123 的回复:
[quote=引用 2 楼 jisj88 的回复:] [quote=引用 1 楼 cwhelucky123 的回复:] 你的程序无有任何问题,也一样出现了结果,不象你说的没有文件,文件也有的,我这里的结果是 你是在linux里面执行的吧?
不是的,我是在windows 10里面用mingw运行程序的 换一种问法,如果要在windows中正确生成文件,要怎么修改[/quote] win10里面为什么要用mingw,工具还不是多的是吗?mingw是为了交叉编译后在在linux里执行的,还有在linux里面system是执行一个命令行,巧合的是这条命令windows也是认识的,所以我认为也一样生成了文件,只是文件可能不在你查看的目录吧,那你试试把reports.log改成绝对路径来试试看呢。 不过总觉得这做法不靠谱,windows里执行,为什么用这一堆linux的头文件来做,并且不是标准C的 [/quote] 搜索了整个电脑文件夹,都没有reports.log文件,是用everything搜索的。 今天切换用cygwin了,还不太会用编译器,所以程序还没重新调整。我也想用Linux,但是学习系统还是要费不少功夫的,我现在还是想打算熟悉下编程语言再去折腾系统。
jisj88 2018-10-30
  • 打赏
  • 举报
回复
引用 9 楼 ckc 的回复:
在system(cmd)前加一句puts(cmd),检查一下字符串正常不正常
测试了,还是不行,帮我看下是哪里出问题了,运行结果如下: chongshiyici(这个是我的输入,下面是命令行的输出) echo 'chongshiyici Tue Oct 30 11:45:06 2018 ' >> reports.log 'chongshiyici -------------------------------- Process exited after 10.48 seconds with return value 0 请按任意键继续. . .
ckc 2018-10-30
  • 打赏
  • 举报
回复
在system(cmd)前加一句puts(cmd),检查一下字符串正常不正常
jisj88 2018-10-30
  • 打赏
  • 举报
回复
引用 13 楼 cwhelucky123 的回复:
我还是觉得生成了文件了,而未能找到,要不然就是编译工具出了问题,但是代码是肯定没有问题的,因为我用这代码在linux和window都无有问题的,就象四楼的老大说的mingw也是为windows准备的编译器,我也真不知道什么问题了
嗯,我近期也是要换Linux,《嗨翻C语言》快看完了,后面第九章的程序好些编译出来,看进程这章,export,execl这些命令都用不了。
jisj88 2018-10-30
  • 打赏
  • 举报
回复
引用 12 楼 ckc 的回复:
字符串里多了两个回车吧
我也觉得是输出的问题。根据下面的输出感觉是引号那里的问题 chongshiyici(这个是我的输入,下面是命令行的输出) echo 'chongshiyici Tue Oct 30 11:45:06 2018 ' >> reports.log /*感觉问题可能在这里,时间函数自动添加了换行号,可能导致管道输出出问题了,不同系统应该不一样*/ 'chongshiyici
  • 打赏
  • 举报
回复
我还是觉得生成了文件了,而未能找到,要不然就是编译工具出了问题,但是代码是肯定没有问题的,因为我用这代码在linux和window都无有问题的,就象四楼的老大说的mingw也是为windows准备的编译器,我也真不知道什么问题了
ckc 2018-10-30
  • 打赏
  • 举报
回复
字符串里多了两个回车吧
自信男孩 2018-10-30
  • 打赏
  • 举报
回复
引用 7 楼 jisj88 的回复:
[quote=引用 5 楼 cfjtaishan 的回复:]
建议去exe所在的目录下找一下reports.log文件.
注意reports.log的路径




搜索了,没有这个文件,今天换编译器了,打算熟悉下cygwin再试下。我在dev c++里面也是这样,感觉对初学者来说,编译器也是个困难点,没看过什么书介绍怎么用编译器的。之前大学的时候还可以用vs 6.0,这玩意太老了,C99的不是标准都不支持了。[/quote]

可以考虑用ubuntu系统
jisj88 2018-10-30
  • 打赏
  • 举报
回复
引用 4 楼 SXJIAKE 的回复:
⒈恰恰相反,MinGW 是为了将 Linux 的源代码编译为 Windows 系统上的 exe 而存在的。 ⒉没看到什么 Linux 的头文件,stdio.h、stdlib.h 和 time.h 都是 C 语言标准库头文件。 ⒊system 是 C 标准库函数,不区分平台,适用于 Windows 和 Linux。要区分也是区分令。 刚好 echo 命令和和重定向符号在 Linux 和 Windows 均支持。所以这代码一点毛病没有。
那么到底出了什么问题呢?
jisj88 2018-10-30
  • 打赏
  • 举报
回复
引用 5 楼 cfjtaishan 的回复:
建议去exe所在的目录下找一下reports.log文件. 注意reports.log的路径
搜索了,没有这个文件,今天换编译器了,打算熟悉下cygwin再试下。我在dev c++里面也是这样,感觉对初学者来说,编译器也是个困难点,没看过什么书介绍怎么用编译器的。之前大学的时候还可以用vs 6.0,这玩意太老了,C99的不是标准都不支持了。
自信男孩 2018-10-29
  • 打赏
  • 举报
回复
建议去exe所在的目录下找一下reports.log文件.
注意reports.log的路径
「已注销」 2018-10-29
  • 打赏
  • 举报
回复
⒈恰恰相反,MinGW 是为了将 Linux 的源代码编译为 Windows 系统上的 exe 而存在的。
⒉没看到什么 Linux 的头文件,stdio.h、stdlib.h 和 time.h 都是 C 语言标准库头文件。
⒊system 是 C 标准库函数,不区分平台,适用于 Windows 和 Linux。要区分也是区分令。
刚好 echo 命令和和重定向符号在 Linux 和 Windows 均支持。所以这代码一点毛病没有。
  • 打赏
  • 举报
回复
引用 2 楼 jisj88 的回复:
[quote=引用 1 楼 cwhelucky123 的回复:]
你的程序无有任何问题,也一样出现了结果,不象你说的没有文件,文件也有的,我这里的结果是

你是在linux里面执行的吧?



不是的,我是在windows 10里面用mingw运行程序的

换一种问法,如果要在windows中正确生成文件,要怎么修改[/quote]
win10里面为什么要用mingw,工具还不是多的是吗?mingw是为了交叉编译后在在linux里执行的,还有在linux里面system是执行一个命令行,巧合的是这条命令windows也是认识的,所以我认为也一样生成了文件,只是文件可能不在你查看的目录吧,那你试试把reports.log改成绝对路径来试试看呢。
不过总觉得这做法不靠谱,windows里执行,为什么用这一堆linux的头文件来做,并且不是标准C的
jisj88 2018-10-28
  • 打赏
  • 举报
回复
引用 1 楼 cwhelucky123 的回复:
你的程序无有任何问题,也一样出现了结果,不象你说的没有文件,文件也有的,我这里的结果是 你是在linux里面执行的吧?
不是的,我是在windows 10里面用mingw运行程序的 换一种问法,如果要在windows中正确生成文件,要怎么修改
  • 打赏
  • 举报
回复
你的程序无有任何问题,也一样出现了结果,不象你说的没有文件,文件也有的,我这里的结果是

你是在linux里面执行的吧?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧