在 C 中将奇数索引元素从一个数组复制到另一个数组

Copying odd-index elements from one array to another in C

所以我有一个程序,其中有用户输入的字符串(一个字符数组),我需要使用内存分配的字符数组指针将所有奇数索引元素复制到另一个数组。

(charPointer 需要分配到使用 malloc 所需的 space 的确切数量)

char charArray[16];

printf("Enter string: ");
scanf("%16s", charArray);

char *charPointer = malloc((sizeof(charArray) / 2 ));
char *d = charPointer;

for (char *p = charArray; *p != '[=10=]'; p++) {

    // Calculates odd-index element using bit operator
    if ((p - charArray) % 2 != 0){
        // Shows which elements should be copied
        printf("%c", *p);

        // Copy *p value to charPointer
        charPointer[p-charArray] = *p;
        charPointer++;
    }
}

while(*d != '[=10=]')
   printf("%c\n",*d++);

但是我得到了奇怪的结果,比如 charPointer 它只复制第一个奇数索引而不复制其余的。我以为我理解指针,但这真的让我感到困惑。感谢您的帮助!

对于初学者来说,这个电话

scanf("%16s", charArray);
       ^^^^ 

不正确。你需要写

scanf("%15s", charArray);
       ^^^^

这个内存分配

char *charPointer = malloc((sizeof(charArray) / 2 ));

分配冗余内存。你应该写

char *charPointer = malloc( strlen(charArray) / 2 + 1 );

这些陈述

    charPointer[p-charArray] = *p;
    charPointer++;

没有意义,因为它们没有在动态指向的字符数组中按顺序写入字符。你至少应该写成

    *charPointer++ = *p;

由于终止零字符 '\0' 没有附加到动态分配的数组中,所以这个 while 循环

while(*d != '[=16=]')
   printf("%c\n",*d++);

调用未定义的行为。

你还应该释放分配的内存。

这是一个演示程序。

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

int main(void) 
{
    char charArray[16]; 
    
    printf( "Enter a string: " );
    scanf( "%15s", charArray );
    
    char *charPointer = malloc( strlen( charArray ) / 2 + 1 );
    
    char *q = charPointer;
    
    for ( const char *p = charArray; *p != '[=17=]'; ++p  )
    {
        if ( ( p - charArray ) % 2 != 0 )
        {
            *q++ = *p;
        }
    }
    
    *q = '[=17=]';
    
    puts( charPointer );
    
    free( charPointer );
    
    return 0;
}

程序输出可能看起来像

Enter a string: 012345678901234
1357913