替换c字符串中的字符

时间:2014-01-27 00:33:27

标签: c pointers c-strings

我在替换c字符串中的字符时遇到了问题。我有一个名为bit的c字符串,初始化为16位的0和1的字符串。我要做的是将字符串转换为二进制补码版本。我学到的是一个简单的任务,如

int twosComplement(int number,char *binary){
    printf("searching for twos complement\n");
    int temp=number * -1;
    if(temp<-32768)
        return 0;
    printf("%d\n",temp);
    char bits[17]="";
    int i;
    int x=0;
    int y;
for(i=15;i>=0;i--){
    y=pow(2,i);
    if(temp%y!=temp){
        temp=temp%y;
        strcat(bits,"1");;
    }
    else{
        strcat(bits,"0");
    }
    printf("%s\n",bits);
    x++;
}

for(x=0;x<16;x++){
    if(bits[x]=='0'){
        *bits="a";
    }
    else{
        strcat(bits,"1");
    }
    printf("%s\n",bits);
}

在C中是非法的,因为bits实际上是指向字符串中第一个字符的指针,因此它会抱怨从整数到指针的赋值而没有强制转换。

以上是此功能的代码。第一部分正常工作,并创建正数的正确16位表示。在下一部分中,我想查看字符串的每个字符并替换为替换字符。此代码编译但不起作用因为我连接。另外,我认为它没有正确读取每个角色的数字。

2 个答案:

答案 0 :(得分:0)

此代码使用命令行在Mac OS X 10.9.1 Mavericks上使用GCC 4.8.2进行干净编译:

gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
        -Wold-style-definition -Werror bits.c -o bits

来源:

#include <math.h>
#include <stdio.h>
#include <string.h>

extern int twosComplement(int number);

int twosComplement(int number)
{
    printf("searching for twos complement of %d\n", number);
    int temp = number * -1;
    if (temp < -32768)
        return 0;
    printf("%d\n", temp);
    char bits[17] = "";
    int i;
    int x = 0;
    int y;
    for (i = 15; i >= 0; i--)
    {
        y = pow(2, i);
        if (temp % y != temp)
        {
            temp = temp % y;
            strcat(bits, "1");
        }
        else
        {
            strcat(bits, "0");
        }
        printf("%s\n", bits);
        x++;
    }

    printf("One's complement:\n");
    for (x = 0; x < 16; x++)
    {
        if (bits[x] == '0')
            bits[x] = '1';
        else
            bits[x] = '0';
        printf("%s\n", bits);
    }
    return 0;
}

int main(void)
{
    twosComplement(23);
    return 0;
}

输出:

searching for twos complement of 23
-23
0
00
000
0000
00000
000000
0000000
00000000
000000000
0000000000
00000000000
000000000001
0000000000010
00000000000101
000000000001011
0000000000010111
One's complement:
1000000000010111
1100000000010111
1110000000010111
1111000000010111
1111100000010111
1111110000010111
1111111000010111
1111111100010111
1111111110010111
1111111111010111
1111111111110111
1111111111100111
1111111111101111
1111111111101011
1111111111101001
1111111111101000

你仍然需要实现两个补码的+1部分。

警惕在这样的循环中使用strcat()。它会导致二次运行时行为,因为strcat()必须在添加新字符之前跳过之前的内容,因此它会跳过0 + 1 + 2 + 3 + 4 + ... N-1个字符,即N(总共跳过N-1)/ 2个字节。

答案 1 :(得分:0)

这是一个更简单的实现你想要做的事情:

#include <stdio.h>
#include <stdint.h>

void binary_string(uint16_t number, char * output) {
    for ( int i = 0; i < 16; ++i ) {
        if ( number & 0x8000 ) {
            output[i] = '1';
        } else {
            output[i] = '0';
        }
        number <<= 1;
    }
}

void complement(uint16_t number, char * output) {
    binary_string(number, output);

    for (int x = 0; x < 16; x++) {
        if (output[x] == '1') {
            output[x] = '0';
        } else {
            output[x] = '1';
        }
    }
}

void complement_better(uint16_t number, char * output) {
    binary_string(~number, output);
}

int main(void) {
    char bits[17] = {0};
    uint16_t number = 57801;

    binary_string(number, bits);
    printf("Before conversion: %s\n", bits);

    complement(number, bits);
    printf("After conversion : %s\n", bits);

    return 0;
}

和输出:

paul@MacBook:~/Documents/src/scratch$ ./tc
Before conversion: 1110000111001001
After conversion : 0001111000110110
paul@MacBook:~/Documents/src/scratch$