小编ci7*_*en4的帖子

传递包含"!!!!"的字符串时argv的奇怪行为

我写了一个小程序,从中获取一些输入参数*argv[]并打印它们.几乎在所有用例中,我的代码都运行得很好.只有在我想要作为参数传递的字符串末尾使用多个感叹号时才会出现问题...

这有效:

./program -m "Hello, world!"
Run Code Online (Sandbox Code Playgroud)

这不起作用:

./program -m "Hello, world!!!!"
Run Code Online (Sandbox Code Playgroud)

^^如果我这样做,程序输出要么是该字符串的两倍,要么是我在./program之前输入的命令.

但是,我绝对不明白:以下,奇怪的是,它的工作原理:

./program -m 'Hello, world!!!!'
Run Code Online (Sandbox Code Playgroud)

^^输出正是......

Hello, world!!!!
Run Code Online (Sandbox Code Playgroud)

......正如所希​​望的那样.

所以,我的问题是:

  • 为什么在字符串中使用多个感叹号时会出现这种奇怪的行为?
  • 据我所知,在C语言中,你使用的""是字符串和''单个字符.那么为什么我在使用时会得到所需的结果'',而不是在""我应该使用时(根据我的理解)?
  • 我的代码中是否有错误或者我需要更改哪些内容才能输入任何字符串(无论是否,使用了什么,以及使用了多少个标点符号)并准确打印出该字符串?

我的代码的相关部分:

// this is a simplified example that, in essence, does the same 
// as my (significantly longer) code
int main(int argc, char* argv[]) {
    char *msg = (char *)calloc(1024, sizeof(char));

    printf("%s", strcat(msg, argv[2])); // argv[1] is "-m"

    free(msg);
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试先将内容复制argv[2]char*缓冲区中并附加一个缓冲区 …

c bash quotes argv

31
推荐指数
3
解决办法
2507
查看次数

SocketCAN:过滤具有某些 CAN ID 的帧不起作用

我正在尝试过滤具有某些 ID 的 CAN 帧,如下所述:https: //landlock.io/linux-doc/landlock-v8/networking/can.html#raw-protocol-sockets-with-can-filters-sock -生的

我的部分代码:

struct can_filter rfilter[4];

if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
    fprintf(stderr, "Error while opening socket.\n");
    exit(EXIT_FAILURE);
}
rfilter[0].can_id   = 0x0D6 | CAN_INV_FILTER;
rfilter[0].can_mask = CAN_SFF_MASK;
rfilter[1].can_id   = 0x0D8 | CAN_INV_FILTER;
rfilter[1].can_mask = CAN_SFF_MASK;
rfilter[2].can_id   = 0x0E4 | CAN_INV_FILTER;
rfilter[2].can_mask = CAN_SFF_MASK;
rfilter[3].can_id   = 0x77F | CAN_INV_FILTER;
rfilter[3].can_mask = CAN_SFF_MASK;
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
Run Code Online (Sandbox Code Playgroud)

如果我只使用四个过滤器之一并注释掉其他三个,它就会按预期工作。如果我使用所有四个过滤器,它根本不起作用。在这种情况下,我仍然可以接收 CANbus 接口上的所有内容。

所以,我的猜测是我的过滤器以某种方式相互抵消了?!我需要更改什么才能过滤 CAN ID 0x0D6、0x0D8、0x0E4 和 0x77F?

c can-bus socketcan

6
推荐指数
1
解决办法
8760
查看次数

如何在X轴上绘制具有正确频率的信号FFT?

我可以使用Matplotlib的plt.psd()方法绘制从RTL-SDR接收到的信号,结果如下图所示: 在此处输入图片说明 我要达到的最终目标是检索某个功率水平(例如-20)以上的所有峰值的坐标。当我从时域接收信号时,我必须先将它们转换为频域,这是通过以下代码完成的:

signal = []
sdr = RtlSdr()
sdr.sample_rate = 2.8e
sdr.center_freq = 434.42e6

samples = sdr.read_samples(1024*1024)
signal.append(samples)

from scipy.fftpack import fft, fftfreq
window = np.hanning(len(signal[0]))
sig_fft = fft(signal[0]*window)
power = 20*np.log10(np.abs(sig_fft))
sample_freq = fftfreq(signal[0].size, sdr.sample_rate/signal[0].size)
plt.figure(figsize=(9.84, 3.94))
plt.plot(sample_freq, power)
plt.xlabel("Frequency (MHz)")
plt.ylabel("Relative power (dB)")
plt.show()

idx = np.argmax(np.abs(sig_fft))
freq = sample_freq[idx]
peak_freq = abs(freq)
print(peak_freq)
Run Code Online (Sandbox Code Playgroud)

此代码产生以下图: 在此处输入图片说明 我无法实现的是,首先,要消除所有噪声并仅绘制一条细线,如psd()图中所示。第二,在x轴上显示正确的频率值。

因此,我的问题是:

  • 我是否以错误的方式应用Hanning窗口,或者如何才能消除所有噪音?
  • 如何在绘图的x轴上获得正确的频率值?

[编辑]

这是我对welch()方法的尝试:

from scipy.signal import welch
sample_freq, power = welch(signal[0], sdr.sample_rate, window="hamming")
plt.figure(figsize=(9.84, 3.94))
plt.semilogy(sample_freq, power)
plt.xlabel("Frequency (MHz)")
plt.ylabel("Relative …
Run Code Online (Sandbox Code Playgroud)

python numpy matplotlib scipy

5
推荐指数
1
解决办法
3156
查看次数

macOS:如何正确安装 JavaFX 以运行 mqtt-spy?

我正在尝试在我的 macOS 10.14 系统上运行mqtt-spy-1.0.0.jar,但它无法启动,返回以下错误消息: 在此处输入图片说明

据开发人员称,如果系统上缺少 JavaFX,则会导致此问题。

如下所示,我的系统上安装了最新版本的 Oracle JDK,但是,我知道 Oracle 已从 v11 中的 JDK 中排除了 JavaFX。 在此处输入图片说明 所以我从 GluonHQ下载了JavaFX并按照他们的说明开始在此处输入图片说明 尽管在 ~/.bash_profile 中正确设置了两个必需的变量,但 mqtt-spy-1.0.0.jar 仍然返回第一个屏幕截图中显示的错误消息......

我还需要做什么或者我需要做什么不同的事情来运行 mqtt-spy?

macos javafx java-11 macos-mojave

2
推荐指数
1
解决办法
1977
查看次数

标签 统计

c ×2

argv ×1

bash ×1

can-bus ×1

java-11 ×1

javafx ×1

macos ×1

macos-mojave ×1

matplotlib ×1

numpy ×1

python ×1

quotes ×1

scipy ×1

socketcan ×1