在我的程序中,我想输入一个整数字符串,例如2107900000.我想得到它的长度,然后想要删除所有的0和1。
答案 0 :(得分:2)
假设你想要构造一个新的字符串,我假设你想要一个只接受指向这样一个字符串的指针的函数:(假设它stripped
所指的是至少相同的大小如orig
)指出的那样
void strip_0s_and_1s(char *orig, char *stripped)
{
// while we haven't seen a null terminator
while(*orig){
// if the current character is not a 1 or a 0...
if(*orig != '0' && *orig != '1'){
// copy the character
*stripped= *orig;
stripped++;
}
// increment pointer to old string
orig++;
}
// terminate 'stripped' string
*stripped= '\0';
}
我认为用两个参数的相同指针调用它应该就地替换...
要解决有关在运行时查找输入字符串长度的问题,您可以执行以下操作:
#include <stdio.h>
#include <string.h>
int main (int argc, char **argv) {
int len;
char str[100]; // max string length of 99+1 null terminator
scanf("%s", str);
len = strlen(str);
printf("%d", len);
return 0;
}
(编辑:更改为删除使用new
作为变量名称)
(编辑:在运行时添加有关输入字符串的信息并查找字符串长度)
答案 1 :(得分:1)
可能不是最佳的,但您可以有条件地将其复制到另一个缓冲区中:
char buffer[20];
char num[] = "2107900000";
int j = 0;
for (int i = 0; num[i]; i++)
{
if (num[i] != '0' && num[i] != '1')
{
buffer[j] = num[i];
j++;
}
}
buffer[j] = 0 //null terminator
或者你可以在一个缓冲区中完成:
char num[] = "2107900000";
int j = 0;
for (int i = 0; num[i]; i++)
{
if (num[i] != '0' && num[i] != '1')
{
num[j] = num[i];
j++;
}
}
num[j] = 0 //null terminator
答案 2 :(得分:1)
for (i=j=0; s[i]=s[j]; i+=((unsigned)s[j++]-'0'>2));
好的,因为需要解释,我的想法是用2个索引,目标(i
)和源(j
)遍历字符串。在每个步骤中,将字符从源索引复制到目标索引,并且由于复制是循环条件,因此如果复制的字符是空终止符,它将终止。在每次迭代时,源索引都会递增(j++
),但是如果复制的字符不是0或1,则目标索引只会递增(如果它是这两个字符中的一个,它将被简单地覆盖在下一次迭代)。测试(unsigned)s[j++]-'0'>2
使用模运算和数字0-9具有连续值作为字符的属性来执行关于源字符是否在'0'
到'1'
范围之外的最佳测试,此真值(分别为0或1表示false或true)被用作增加目标索引的数量。