0
#include <iostream>
#include <cstdlib>
#include <string>
#include <ctype.h>
#include <cmath>
#include <functional>
#include <numeric>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[])
{

int length = 0;

cout << "Enter a string: ";

string buffer;
char buff[1024];

while (getline(cin, buffer)) 
{
    buffer.erase(remove_if(buffer.begin(), buffer.end(), not1(ptr_fun(isalnum))), buffer.end());
    break;
}

length = buffer.length();
int squareNum = ceil(sqrt(length));

strcpy(buff, buffer.c_str());

char** block = new char*[squareNum];
for(int i = 0; i < squareNum; ++i)
block[i] = new char[squareNum];

int count = 0 ;

for (int i = 0 ; i < squareNum ; i++)
{
    for (int j = 0 ; j < squareNum ; j++)
    {
        block[i][j] = buff[count++];
    }
}

for (int i = 0 ; i < squareNum ; i++)
{
    for (int j = 0 ; j < squareNum ; j++)
    {
        cout.put(block[j][i]) ;
    }
}

return 0;

}

错误:

asst4.cpp:在函数'int main(int,char**)'中:
asst4.cpp:30:76: 错误: 没有匹配函数调用'ptr_fun()'
asst4.cpp:30:76: 注意:候选人是:
/usr/include/c++/4.6/bits/stl_function.h:443:5: 注意:模板 std::pointer_to_unary_function std::ptr_fun(_Result (*)(_Arg))
/usr/include/c++/4.6/bits/stl_function.h:469:5: 注意:模板 std::pointer_to_binary_function std::ptr_fun(_Result (*)(_Arg1, _Arg2))
asst4.cpp:37:29:错误:未在此范围内声明“strcpy”
4

3 回答 3

4

std::strcpycstring标题中,应该包括在内。

std::isalnum也在locale标题中,std::ptr_fun不能选择一个,你需要。您应该手动指定它

std::not1(std::ptr_fun<int, int>(std::isalnum))

std::isalnum转换为需要的签名

std::not1(std::ptr_fun(static_cast<int(*)(int)>(std::isalnum)))
于 2013-10-28T08:31:53.907 回答
0

对于该strcpy问题,请改用 eg std::copy,或包含<cstring>包含strcpy.

并不是说您真的需要那个临时buff变量,因为您也可以使用例如buffer[count++]

于 2013-10-28T08:33:03.667 回答
0

strcpy错误很明显——只是#include <cstring>

对于该ptr_fun()错误,我的猜测是您using namespace std导致它尝试使用标头中的模板版本std::isalnum之一<locale>。只需将呼叫更改为

not1(ptr_fun(::isalnum))

让它在我的系统上用 g++ 和 clang 愉快地编译。

于 2013-10-28T08:37:52.657 回答