0

所以我尝试在 C++ 中创建一个函数,将用户输入的每个字符转换为“*”。但是当我运行 .exe 文件 (CMD) 时,它会要求输入密码,但是当我输入一个单词时,它会给我一个错误:“调试断言失败。” 知道为什么会这样吗?

这是我的代码:

#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "string"
#include "ctype.h"

using namespace std;

void encrypt(char string[], int len)
{
    for (int count = 0; count < len; count++)
        if (isalpha (string [count] ) )
            string[count] = '*';
}


int _tmain(int argc, _TCHAR* argv[])
{
    char Text[40];
    int Size = strlen(Text);
    cout << "Enter your desired password: ";
    cin >> Text;
    encrypt(Text, Size);
    cout << Text << endl;
    _getch();
    return 0;
}
4

5 回答 5

2

只需在“cin >> Text;”行之后移动“int Size = strlen(Text)”即可

于 2012-02-11T09:10:10.543 回答
1

您的 for 循环没有考虑输入文本的长度。相反,它通过在未初始化的 char 数组上调用 strlen 来提供 Size,该数组通常充满随机值。您的编译器应该对此发出警告。不要一直忽视警告。

char Text[40];
int Size = strlen(Text);

由于 strlen 遵循字符序列,直到找到 NUL ( 0x0 ) 它可能从 40 个字符空间的末尾掉到堆栈的其他部分,因此给您一个运行时错误 ( Segmentation Violation )

于 2012-02-11T09:14:24.333 回答
0

strlen(Text) 通过搜索“\0”返回字符串的长度。您应该在用户输入文本后执行此操作。

char Text[40];
cout << "Enter your desired password: ";
cin >> Text;
int Size = strlen(Text);
encrypt(Text, Size);
于 2012-02-11T09:10:56.050 回答
0

您在输入文本之前获取了文本的大小。

...
int _tmain(int argc, _TCHAR* argv[])
{
    char Text[40];
    // int Size = strlen(Text); // to early
    cout << "Enter your desired password: ";
    cin >> Text;
    int Size = strlen(Text); // now Text is filled and the Size will not change.
    encrypt(Text, Size);
    cout << Text << endl;
    _getch();
    return 0;
}
于 2012-02-11T09:11:38.630 回答
0

你把线

int ln 〓 strlen(Text);

太早了,因为用户没有输入文本。您需要在该行之后移动它:

cin >> Text;

让它工作。

于 2013-10-03T06:15:30.390 回答