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

Posted

技术标签:

【中文标题】在C中将奇数索引元素从一个数组复制到另一个数组【英文标题】:Copying odd-index elements from one array to another in C 【发布时间】:2021-11-26 21:33:27 【问题描述】:

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

(charPointer 需要分配给使用 malloc 所需的确切空间量)

char charArray[16];

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

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

for (char *p = charArray; *p != '\0'; 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 != '\0')
   printf("%c\n",*d++);

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

【问题讨论】:

charPointer++; 如果你也在索引它,我不认为你想要那个。 似乎过于复杂:for (int i = 1, j = 0; i < strlen(charArray); i += 2) charPointer[j++] = charArray[i]; 您是否可以发布一个最小且完整的示例。如果我们无法编译代码,就不可能得到你奇怪的结果。请阅读How to create a Minimal, Reproducible Example 了解如何操作。 【参考方案1】:

对于初学者来说这个电话

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 != '\0')
   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 != '\0'; ++p  )
    
        if ( ( p - charArray ) % 2 != 0 )
        
            *q++ = *p;
        
    
    
    *q = '\0';
    
    puts( charPointer );
    
    free( charPointer );
    
    return 0;

程序输出可能看起来像

Enter a string: 012345678901234
1357913

【讨论】:

长度应为 (strlen(charArray)+1)/2+1 @PtitXav 你错了。 :@VladfromMoscow:你是对的。我假设第一个索引是 1。 谢谢!这真的很有帮助。我想澄清一件小事,*q = '\0' - 这只是意味着在该数组的末尾添加一个 \0 吗?这是必需的还是只是一个好的做法? @TorusWithSprinkles 在您的代码中,您使用了循环 while(*d != '\0') 但数组不包含终止零。如果您希望数组包含字符串,则它是必需的。在这种情况下,您可以使用 puts 函数。

以上是关于在C中将奇数索引元素从一个数组复制到另一个数组的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中将对象数组复制到另一个数组中(深度复制)

java一维数组中将数组索引位置是0~4之间的元素复制到新的数组中并输出,求代码。

从数组复制 C/C++

写一个方法,将一个整形数组中的偶数复制到另一个数组中,用java写。

在javascript中将对象数组复制到另一个数组而没有对象引用(深拷贝)

如何在 SQL Server 中将索引从一个表复制到另一个表