无法让c++函数使用来自用户的字符串

Cannot Get C++ Function to Use String from User

本文关键字:用户 字符串 c++ 函数      更新时间:2023-10-16

请帮忙。

我在这里有一个程序,它在头文件中调用一个函数。

#include <iostream>
#include "md5.h"
#include <string>
using namespace std;
int main(){
 string x;
 char* v_MD5String;
 MD5 md5 ;
 v_MD5String = "Hello World";
 x = puts(md5.digestString(v_MD5String));
 cout << x;
 return 0;}

调用的函数:

char* digestString( char *string ){
Init() ;
Update( (unsigned char*)string, strlen(string) ) ;
Final() ;
return digestChars ;}

上面的工作,但是当我使用来自用户的输入时,它编译,但是运行崩溃,没有任何错误。

在程序中,这被改变了:

v_MD5String = "Hello World";

:

cin >> v_MD5String;

我该怎么做才能让它工作?

谢谢。

所以,如果我理解正确的话,你在头文件中声明了以下函数,你不能修改:

char* digestString( char *string );

您首先应该知道这是有问题的编码风格。该函数接受char *而不是char const *,这意味着传递的数据是更改的,但它返回一些东西。我不得不在你链接的页面上发布的实现中挖掘,发现string实际上是一个输入参数,因此作者只是忘记了使用const,数据无论如何都不会改变。

(不打算修改的数据至少是我的假设根据肤浅的代码分析和一些编译测试。你应该问作者是否真的确定!)

如果你在c++中使用这个函数,你的第一个任务应该是提供一个更安全,易于理解的包装函数,它使用真正的c++字符串(std::string类),而不是C字符串(它恰好是指向内存中字符的完全未封装的指针,这在C世界中是好的,但在c++中不是)。您已经在程序中使用了一个std::string。这很好。现在更多地使用它:

std::string SafeDigestString(MD5 &md5, std::string const &input)
{
    // the input of digestString will never be modified:
    return md5.digestString(const_cast<char *>(input.c_str()));
}

const &和参数名都清楚地表明我们正在处理输入。

请注意,我使用const_cast<char *>std::string的c兼容数据表示(即char const *)传递给digestString函数。这是一个罕见的情况下,const_cast是合适的;这也是一个典型的例子,即弥补在其他代码中必须使用的const声明的缺点。如果MD5类中的所有函数都正确地声明了它们的输入参数const,那么就不需要const_cast了。

还请注意,我只是在每个std标识符前加上std::,而不是using namespace std。这通常是更好、更简单、更一致的选择。


现在我们有了安全的c++机制,main变得非常简单:

int main()
{
    MD5 md5;
    std::string result = SafeDigestString(md5, "Hello World");
    std::cout << result << "n";
}

我们已经为实现用户输入奠定了基础,这最好使用std::getline函数来完成:

int main()
{
    MD5 md5;
    std::string input;
    std::getline(std::cin, input);
    std::string result = SafeDigestString(md5, input);
    std::cout << result << "n";
}