为什么 awk 命令使用单引号和双引号不能产生相同的结果?
root@vm90:/root# who | awk "{ print $2 }"
...
root@vm90:/root# who | awk '{ print $2 }'
...
Run Code Online (Sandbox Code Playgroud)
我想在 PHP shell_exec() 函数中使用 awk,该函数在整个代码中使用简单引号。
这 ...
$output = shell_exec("who | awk '{ print $2 }'");
Run Code Online (Sandbox Code Playgroud)
...有效,但我更喜欢...
$output = shell_exec('who | awk "{ print $2 }"');
Run Code Online (Sandbox Code Playgroud)
……这个,不行。
请看下面的代码片段,它基本上只是将 1 个字节向左移动 24 位。
uint64_t i = 0xFFFFFFFF00000000;
printf("before: %016llX \n", i);
i += 0xFF << 24;
printf("after : %016llX \n", i);
// gives:
// before: FFFFFFFF00000000
// after : FFFFFFFEFF000000
Run Code Online (Sandbox Code Playgroud)
最重要的 32 位是FFFFFFFE
(E
在最后观看)。这并不像我预期的那样。我不明白为什么左移 1 个字节 24 位会触及位 #32(位 #31 应该是最后一个修改的)它把最后一个F
( 1111
) 变成了E
( 1110
) 。
为了使其正常工作,我使用了0xFF
无符号 ( 0xFFU
)。
uint64_t i = 0xFFFFFFFF00000000;
printf("before: %016llX \n", i);
i += 0xFFU << 24;
printf("after : %016llX \n", i); …
Run Code Online (Sandbox Code Playgroud) 我想将二进制文件源复制到文件目标.而已!该代码的灵感来自Internet上的许多示例.
#include <stdio.h>
int main(int argc, char **argv) {
FILE *fp1, *fp2;
char ch;
fp1 = fopen("source.pdf", "r");
fp2 = fopen("target.pdf", "w");
while((ch = fgetc(fp1)) != EOF)
fputc(ch, fp2);
fclose(fp1);
fclose(fp2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果文件大小不同.
root@vm:/home/coder/test# ls -l
-rwxr-x--- 1 root root 14593 Feb 28 10:24 source.pdf
-rw-r--r-- 1 root root 159 Mar 1 20:19 target.pdf
Run Code Online (Sandbox Code Playgroud)
好的,那有什么问题呢?
我知道char是未签名的,并且在80以上时签名.请看这里.
这在我使用时得到证实,printf("%x\n", ch);
它有时会返回大约50%的时间FFFFFFE1
.
我的问题的解决方案是使用int
iso char
.