我从过去的试卷中得到以下问题:

考虑以下源代码:

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/

10-11 22:10