我从过去的试卷中得到以下问题:
考虑以下源代码:
using namespace std;
int main()
{
char dest[20];
printf( "%s\n", altcopy( dest, "demo" ) );
printf( "%s\n", altcopy( dest, "demo2" ) );
printf( "%s\n", altcopy( dest, "longer" ) );
printf( "%s\n", altcopy( dest, "even longer" ) );
printf( "%s\n", altcopy( dest, "and a really long string" ) );
}
提供一个名为altcopy()的函数的实现,该函数使用指针算术将C型字符串的备用字符复制到目标位置(即第一个,第三个,第五个等字符)。您的答案不得使用[]运算符访问数组索引。上面的代码将输出以下内容:
dm
dm2
lne
ee ogr
adaral ogsrn
我尝试如下:
using namespace std;
char* altcopy (char* dest, const char* str)
{
char* p = dest;
const char* q = str;
for ( int n=0; n<=20; n++ )
{
*p = *q;
p++;
q++;
q++;
}
return dest;
}
int main()
{
char dest[20];
printf( "%s\n", altcopy( dest, "demo" ) );
printf( "%s\n", altcopy( dest, "demo2" ) );
printf( "%s\n", altcopy( dest, "longer" ) );
printf( "%s\n", altcopy( dest, "even longer" ) );
printf( "%s\n", altcopy( dest, "and a really long string" ) );
}
结果是:
dm
dm2lne
lne
ee ogradaral ogsrn
adaral ogsrn
我不确定为什么在某些输出上恰好有下一个语句结果的重复,而不是按照问题的要求执行。这里有什么帮助吗?
最佳答案
您的函数至少是无效的,至少因为它使用了幻数20。
该函数应类似于标准函数strcpy
,即它必须复制源字符串,直到遇到终止的零为止。
这是一个简单的函数实现
#include <iostream>
char * altcopy( char *dest, const char *str )
{
char *p = dest;
while ( *p++ = *str++ )
{
if ( *str ) ++str;
}
return dest;
}
int main()
{
char dest[20];
std::cout << altcopy( dest, "demo" ) << std::endl;
std::cout << altcopy( dest, "demo2" ) << std::endl;
std::cout << altcopy( dest, "longer" ) << std::endl;
std::cout << altcopy( dest, "even longer" ) << std::endl;
std::cout << altcopy( dest, "and a really long string" ) << std::endl;
return 0;
}
输出是
dm
dm2
lne
ee ogr
adaral ogsrn
请享用!:)
关于c++ - 指针算术,通过引用传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23941253/