strncpy()据说可以防止缓冲区溢出.但是如果它在没有null终止的情况下防止溢出,那么随后的字符串操作将会溢出.所以为了防止这种情况,我发现自己在做:
strncpy( dest, src, LEN );
dest[LEN - 1] = '\0';
Run Code Online (Sandbox Code Playgroud)
man strncpy 得到:
strncpy()函数类似,只是复制了不超过n个字节的src.因此,如果src的前n个字节中没有空字节,则结果将不会以空值终止.
没有null终止看似无辜的东西,如:
printf( "FOO: %s\n", dest );
Run Code Online (Sandbox Code Playgroud)
......可能会崩溃
是否有更好,更安全的替代品strncpy()?
常见的Clojure编程错误的一个例子是期望评估延迟表达式的副作用.从表面上看,检查未使用的惰性表达式会有所帮助.识别这个和其他常见错误的最佳方法是什么?核心编译器是否应检查这些情况,还是应该检测到lint程序的域?什么是开始实施的好方法?
我想提供消息读取器/写入器的多个实现.什么是最好的方法?
这是我目前正在思考的一些伪代码:
只需拥有一组所有实现必须提供的功能,并将其留给调用者以保持正确的流
(ns x-format)
(read-message [stream] ...)
(write-message [stream message] ...)
Run Code Online (Sandbox Code Playgroud)返回一个带有两个闭合函数的映射,这些函数保持在流
(ns x-format)
(defn make-formatter [socket]
{:read (fn [] (.read (.getInputStream socket))))
:write (fn [message] (.write (.getOutputStream socket) message)))})
Run Code Online (Sandbox Code Playgroud)别的什么?
这是一个过于简单的例子:
我可以封装一个实现细节,例如使用原子作为计数器:
(defn make-counter
([] (make-counter 0))
([init-val]
(let [c (atom init-val)]
{:get (fn [] @c)
:++ (fn [] (swap! c inc))})))
Run Code Online (Sandbox Code Playgroud)
但这意味着我需要重新定义所有内容以添加功能(无继承):
(defn make-bi-counter
([] (make-bi-counter 0))
([init-val]
(let [c (atom init-val)]
{:get (fn [] @c)
:++ (fn [] (swap! c inc))
:-- (fn [] (swap! c dec))})))
Run Code Online (Sandbox Code Playgroud)
而如果可以只扩展一个功能:
(assoc c :-- (env (:++ c) (fn [] (swap! c dec))))
(def c (make-counter))
(def b (make-bi-counter))
user=> ((:-- b))
-1
user=> ((:-- b))
-2
user=> ((:get b))
-2
Run Code Online (Sandbox Code Playgroud)
或者我可以暴露原子并具有独立的功能: …
我想在xml树上结合三个zip-filter查询的结果.我正在解析的XML看起来像这样:
<someroot>
<publication>
<contributors>
<person_name>
<surname>Surname A</surname>
</person_name>
<person_name>
<given_name>Given B</given_name>
<surname>Surname B</surname>
<suffix>Suffix B</suffix>
</person_name>
</contributors>
</publication>
</someroot>
Run Code Online (Sandbox Code Playgroud)
从这个例子中你可以看到<given_name>并且<suffix>是可选的 - 只<surname>需要它.这就是我的问题 - 如果我运行三个单独的查询,我得到的响应将彼此不同:
(xml-> xml :publication :contributors :person_name :given_name text)
(xml-> xml :publication :contributors :person_name :surname text)
(xml-> xml :publication :contributors :person_name :suffix text)
Run Code Online (Sandbox Code Playgroud)
运行这三个查询后,我将留下三个基数不匹配的序列; given_name并且suffix长度为1而surname长度为2.这使我无法组合每个名称的组成部分.我需要编写一个查询,在序列构建期间执行此名称连接.
我正在查看非常稀疏的文档,clojure.contrib.zip-filter.xml并且无法弄清楚我是如何做到的(或者如果它甚至可能).不幸的是,我是一个Clojure(和Lisp)的新手!任何人都可以指出我如何编写一个将连接其他三个嵌入式查询的查询?
有没有办法发现当前拥有锁的线程?具体来说,我正在寻找一些代码来打印阻止锁定的线程.我想尝试锁定给定的超时,然后报告哪个线程阻止锁被采取.
(set! *warn-on-reflection* true)
(proxy [javax.swing.JPanel] []
(paintComponent [#^java.awt.Graphics g]
(proxy-super paintComponent g)
(.fillRect g 100 100 10 10)))
Run Code Online (Sandbox Code Playgroud)
"反射警告,调用paintComponent无法解决"
我有一个宏从资源中啜饮markdown文件.它提供了一种提供一些内容的便捷方式.但是当我编辑markdown文件时,Figwheel无法知道它需要重新评估宏.
将markdown放在cljs文件中的字符串中是不可取的,因为具有换行符的字符串会被大多数Clojure编辑器缩进,这会导致markdown不正确(前导空格在markdown中有意义).
有没有办法在降价文件发生变化时检测/刷新?还是更好的解决方案?
以下是我尝试做的基本示例:https: //github.com/timothypratley/figwheel-watch-markdown-example
我正在寻找一些用于在视觉上展示Floyd-Warshall的实用性的想法.到目前为止,我能想到的是生成随机图,允许用户选择开始/结束并突出显示最短路径.有什么更有趣但简单的示范路径寻找的有用性?
现在我有六个班级:
但是它们就像意大利面条一样到处相互引用…… The World 是 MessageProcessor、Intelligence 和 Tasks 类修改的数据模型。Ticker 协调这三个类更新世界。MessageProcessor 使用 Listener 接收消息,其他类使用 Listener 推送更新。
我怎样才能改善这种情况?
clojure ×6
c# ×2
.net ×1
algorithm ×1
c ×1
figwheel ×1
inheritance ×1
lint ×1
lisp ×1
markdown ×1
monitor ×1
reflection ×1
strncpy ×1
xml ×1
xml-parsing ×1