提问人:TorusWithSprinkles 提问时间:10/7/2021 最后编辑:Vlad from MoscowTorusWithSprinkles 更新时间:10/7/2021 访问量:420
在 C 中将奇数索引元素从一个数组复制到另一个数组
Copying odd-index elements from one array to another in C
问:
所以我有一个程序,其中我有用户输入字符串(一个 char 数组),我需要使用内存分配的指针到 char-array 将所有奇数索引元素复制到另一个数组。
(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 一样,它只复制了第一个奇数索引,而不是其余的索引。我以为我理解了指针,但这真的让我感到困惑。我感谢任何帮助!
答:
2赞
Vlad from Moscow
10/7/2021
#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
评论
0赞
Ptit Xav
10/7/2021
长度应为 (strlen(charArray)+1)/2+1
1赞
Vlad from Moscow
10/7/2021
@PtitXav 你错了。
0赞
Ptit Xav
10/7/2021
:@VladfromMoscow : 你是对的。我假设第一个索引是 1。
0赞
TorusWithSprinkles
10/7/2021
谢谢!这真的很有帮助。我想澄清的一件小事, - 这仅仅意味着在该数组的末尾添加一个 \0 吗?这是必需的还是只是一个好的练习?*q = '\0'
1赞
Vlad from Moscow
10/7/2021
@TorusWithSprinkles 在您的代码中,您使用了循环 while(*d != '\0'),但数组不包含终止零。如果希望数组包含字符串,则需要它。在这种情况下,您可以使用例如函数 puts。
评论
charPointer++;
如果你也索引它,我认为你不希望这样做。for (int i = 1, j = 0; i < strlen(charArray); i += 2) { charPointer[j++] = charArray[i]; }