★c语言★如何删除字符串中的第一位?★
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了★c语言★如何删除字符串中的第一位?★相关的知识,希望对你有一定的参考价值。
给定一个字符串str1=^abc,如何将第一位的^删除?
要用c语言 而不是c++
#include "stdio.h"
#include <string.h>
void main()
char str1[10]="^abc";
strcpy(str1,str1+1);
printf("删除后的字符串为:\n");
puts(str1);
参考技术A 从第二个元素开始将每个元素前移一位,最终第一位的就没覆盖了;
例如:
for(i=0;str[i]!=='\0';i++) str[i]=str[i+1];
这里我们在遇到'\0'时退出了for循环,所以\0这个字符没有进行前移,我们要把它也前移一下
也就是 退出循环后再进行一次 str[i]=str[i+1] 操作
完整代码
#include "stdio.h"
void main()
char str[7]="^abc";
int i;
for(i=0;str[i]!='\0';i++) //i从1开始,表示从第二个元素开始前移
str[i]=str[i+1];
str[i]=str[i+1];
printf("删除头元素后的字符串为:\n");
puts(str);
运行结果正常 参考技术B STRING Delete(STRING s,int i,int j) 。* 调用Delete删除函数删除来删除字符串s8 *。 int k; for(k=i+j-8;k<=s。len;k++) s。ch[k-j]=s。ch[k]; s。len=s。len-j; return(s); la『osb━邸v⑦ο≈①kニwwv⑦ο≈①本回答被提问者采纳
以x86汇编语言获取EAX寄存器的第一位
在x86汇编语言中,是否可以获得寄存器的第一位?我想获得eax
寄存器的第一位并将其移至ebx
,但我不知道该如何做到这一点。
.stack 2048
.data
ExitProcess proto, exitcode:dword
.code
start:
mov eax, 3;
;now I want to move the first bit of eax into ebx. How can I obtain the first bit from eax?
invoke ExitProcess, 0
end start
如果通过“第一位”表示最低有效位,则尝试:
...
mov ebx, eax
and ebx, 01
你显然不明白指令一次对命名寄存器中的所有位进行操作,而“和”指令逐位组合它们的操作数。
以下工作也是如此,可以说是对您的请求的更直接的解释(“获取eax的第一位,然后放入EBX”)但它会破坏EAX的内容:
...
and eax, 1
mov ebx, eax
在汇编代码中,由于您的寄存器很少,它们的内容往往很珍贵,因此通常可以避免在计算新结果时破坏一个寄存器的内容。 (当你不能,你不能,但这种情况很容易避免)。
最后,你可以写:
...
mov ebx, 1
and ebx, eax
这很好用,和其他两个一样快。我更喜欢第一个,因为它强调恕我直言,因为首先提到它,而不是“1”,这只是一个偶然的常数,我关心的价值(EAX的内容)。这种风格看起来似乎并不重要,但是如果你编写了很多代码,特别是汇编程序等神秘的东西,那么为了最大限度地提高后续可读性而做的事情是值得的。
找到英特尔参考手册是值得的,并仔细阅读它们以了解每台机器指令的作用。这似乎是一项艰巨的任务,因为它是一本大书;只关注您最初似乎需要的说明。
从寄存器中获取一个位涉及使用掩码的and
操作,该掩码在感兴趣的位位置具有1,在所有其他位中具有0。然后可选地,使用rotate right
或rotate left
将位移动到结果中的所需位置。
您还可以使用程序集的rotation属性,即使用bit指令将指定位复制到进位标志中,我们可以使用rotation-carry标志指令。
我认为这对于理解在使用和放置爆破位的位置和方式方面的进展非常有效。
如上所述,使用mov
和and
是最快的解决方案,但编程的有趣部分是可以找到解决单个问题的许多解决方案,因此作为一种效率较低的替代方案,您可以使用以下代码之一。
所以你也可以像这样解决它:
xor ebx, ebx ; sets ebx = 0
TEST eax, 1 ; is the lowest bit set?
JZ skip_add ; if low bit is zero, skip next instruction
; if lowest bit was set / AND op resulted not zero
add ebx, 1 ; ebx += 1, or use `INC ebx`
skip_add:
; process the result
或者,您也可以使用:
xor ebx, ebx ; ebx = 0
shr eax, 1 ; shift right: lowest bit in carry flag now
adc ebx, 0 ; ebx += 0 + carry bit
shl eax, 1 ; get back original value of eax, `shl` and `or` with ebx
or eax, ebx ; or use `push eax` and `pop eax` instead
另一种选择(类似于其他答案,但更加省力):
push eax
and eax, 1
xchg ebx, eax ; swap contents, could also use `mov` here
pop eax
请注意,这两个解决方案都不会更改eax
中的值,因此您仍然可以自由地使用eax中的值。另请注意,评论值适用于值为3的eax
,因为问题中使用了mov eax, 3
。
如果您已经知道,ebx
为零,您可以跳过xor
线,如果更改eax
无关紧要,您也可以删除shl
操作。因此,您可以看到实际操作是通过大约两条指令完成的。关于μops,请参阅Peter的评论。
......第一位:
test eax, 1
setz ebx
短剑
以上是关于★c语言★如何删除字符串中的第一位?★的主要内容,如果未能解决你的问题,请参考以下文章
如何删除字符串最后一位&JAVA&Android&AndroidStudio