printf显示“ -858993460”或“╠╠╠╠╠╠╠╠”;这些是什么?

时间:2018-08-09 15:47:09

标签: c printf display

我正在尝试构建一个对密码进行加密的程序,然后执行相反的过程(从已加密的密码中读出正确的密码)。

为此,我有:

  • 密码(char[]类型);

  • 加密密钥( vector -int[]类型),其长度与密码的char相同;

  • 两步(也放置在int step[2]类型的 vector 中)。

要求是必须使用以下两个步骤来构建加密过程:

  • 第一个(step[0]中的值)用于将密码char的第一个位置开始的值(ASCII)添加到加密密钥 vector的第一个位置等于第一步step[0]的许多步骤;
例如,

char password[0]添加到int key[0],然后将char password[1]添加到int key[1],依此类推,直到步数等于{{1}中的值}。

  • 第二个密码(step[0]从密码step[1]的ASCII值的对应位置中减去与第二个步骤({{ 1}})。
例如,

是从char中减去step[1],然后从char password[5]中减去int key[5],依此类推,直到步数等于{{1}中的值}。

然后重复该过程,直到密码字符的长度结束。

我建立了一个下面的函数,该函数应该执行此操作(将多个步骤相加,然后将多个其他步骤相减,然后重复该过程直到密码char结束-加密密钥向量具有相同的长度作为密码char)。

结果被放置在新的矢量中(用于加密)或新的char password[6]中(用于反向查找密码)。

int key[6]

然后,如果我尝试step[1]矢量(用于加密过程)以显示矢量的内容,则会出现类似以下消息:

char

为什么显示“ -858993460”?


此外,如果尝试使用以下代码void criptareFinal(char password4[255], int longKey1[255], int b4, int step2[2]) { int encryptedPass[255]; int a = step2[0], b = step2[1], n = b4, i, ap = a, bp = b; for (i = 0; i < n; i++) { if (ap > 0) { encryptedPass[i] = longKey1[i] + password4[i]; ap--; } else if (bp > 0) { encryptedPass[i] = longKey1[i] - password4[i]; bp--; } else if (ap == 0 && bp == 0) { ap = a; bp = b; } } int i1; printf("\n"); for (i1 = 0; i1 < b4; i1++) printf("%d ", encryptedPass[i1]); } printf以相反的过程显示密码(将密码加密成可读的密码),

1090 923 916 1151 942 913 962 998 960 936 962 917 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460

然后出现此消息:

printf

什么是“╠”?

此“╠╠╠╠╠╠╠╠”显示不正确(其余“côő〜y​​paXOF”正确)。


也。我试图在字符串/向量的末尾添加手动形式char,如果这样做,则不会出现类型为void decriptareFinal(int encryptedPass5[255], int longKey2[255], int b5, int steps3[2]) { char Password1[255]; int a = steps3[0], b = steps3[1], n = b5, i2, ap = a, bp = b; for (i2 = 0; i2 < n; i2++) { if (ap > 0) { Password1[i2] = encryptedPass5[i2] - longKey2[i2]; ap--; } else if (bp > 0) { Password1[i2] = longKey2[i2] - encryptedPass5[i2]; bp--; } else if (ap == 0 && bp == 0) { ap = a; bp = b; } } int j2; printf("\n"); for (j2 = 0; j2 < b5; j2++) printf("%c", Password1[j2]); } 或类型为{{1 }}出现。 它工作正常,并且告诉我côő~ypaXOF╠╠╠╠╠╠╠╠ (密码)或[0](键)中的值正确。

如果这很重要,我可以在 Windows 64bit 上工作,但是我使用的是 Visual Studio 。 另外,我有一台 Mac 。那里我有同样的问题,但是我收到的不是其他消息(例如-858993460而不是╠╠╠╠╠╠╠╠,而不是charint

3 个答案:

答案 0 :(得分:0)

我对您的代码进行了很多更改。这是列表:

  • 为标准库添加了更多#include标签(我想您已经有一些并且没有发布它们了)
  • 将函数参数更改为char*而不是char[],在函数参数中使用char数组并不常见,我什至不知道它们在代码中如何工作。
  • 摆脱了不必要的/多余的变量:apbp和其他一些变量。由于C是传递值,因此steps变量不需要临时变量。
  • 固定的变量命名。您的许多变量名都不是直觉的/怪异的,我觉得我不得不将名称更改为更准确的名称。
  • 使用malloc(动态内存分配),而不是将char数组放在堆栈上。这更加灵活,减少了此类陷阱的发生,但确实为段错误开辟了更多的可能性。
  • 修复了您的加密/解密算法,因为如果刚完成两个步骤(char),它将使ap == 0 && bp == 0保持不变。
  • 修复了一些语法错误。
  • 添加了一些调试fprintf语句,因此您可以查看正在发生的情况。

对于奇怪的╠字符,除了您可能有一些内存错误或者您的环境正在Unicode和ASCII之类的切换之外,我看不到为什么您的代码会打印出来。坦白说,我不想弄清楚,因为您的代码有点混乱,我也不认为您发布了所有代码,因为它在我第一次运行时出现编译错误。

我还向'\0'字符串的末尾添加了一些空终止符(malloc),这对于调试时正确打印字符串很方便。


无论如何,足够了。这是代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *criptareFinal(char *plaintext, int *key, int len, int *steps) {
    char *ciphertext = malloc(len + 1);
    int a = steps[0], b = steps[1], n = len;

    for (int i = 0; i < n; i++) {
        if (a == 0 && b == 0) {
            a = steps[0];
            b = steps[1];
        }

        if (a > 0) {
            ciphertext[i] = key[i] + plaintext[i];
            a--;
        }
        else if (b > 0) {
            ciphertext[i] = key[i] - plaintext[i];
            b--;
        }
    }

    ciphertext[len] = '\0';

    fprintf(stderr, "\n");
    fprintf(stderr, "ENCRYPTION: ");
    for (int i = 0; i < n; i++)
        fprintf(stderr, "%d ", ciphertext[i]);

    return ciphertext;
}

char *decriptareFinal(char *ciphertext, int *key, int len, int *steps) {   
    char *plaintext = malloc(len + 1);
    int a = steps[0], b = steps[1], n = len;

    for (int i = 0; i < n; i++) {
        if (a == 0 && b == 0) {
            a = steps[0];
            b = steps[1];
        }

        if (a > 0) {
            plaintext[i] = ciphertext[i] - key[i];
            a--;
        }
        else if (b > 0) {
            plaintext[i] = key[i] - ciphertext[i];
            b--;
        }
    }

    plaintext[len] = '\0';

    fprintf(stderr, "\n");
    fprintf(stderr, "DECRYPTION: ");
    for (int i = 0; i < n; i++)
        fprintf(stderr, "%d ", plaintext[i]);

    return plaintext;
}

int main() {
    char *toEncrypt = "Hello World!";
    int steps[] = {2, 3};
    int key[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};

    int len = strlen(toEncrypt);

    fprintf(stderr, "INITIAL: ");
    for (int i = 0; i < len; i++)
        fprintf(stderr, "%d ", toEncrypt[i]);

    fprintf(stderr, "\n");
    char *encrypted = criptareFinal(toEncrypt, key, len, steps);
    fprintf(stderr, "\n");
    fprintf(stderr, "ENCRYPTED: %s\n", encrypted);
    char *decrypted = decriptareFinal(encrypted, key, len, steps);
    fprintf(stderr, "\n");
    fprintf(stderr, "DECRYPTED: %s\n", decrypted);

}

注意:此代码中没有错误处理,因此,如果用户输入几乎完全无效,则代码将中断并可能导致段错误,无限循环等。您应该添加错误处理在适当的应用程序中使用它之前,请进行每个char*操作和数组迭代。


以及一些示例输出:

INITIAL: 72 101 108 108 111 32 87 111 114 108 100 33

ENCRYPTION: 73 103 -105 -104 -106 38 94 -103 -105 -98 111 45
ENCRYPTED: Igùÿû&^Öù₧o-

DECRYPTION: 72 101 108 108 111 32 87 111 114 108 100 33
DECRYPTED: Hello World!

如果您有任何疑问,请告诉我。

答案 1 :(得分:0)

在第一个函数中,您一次将i0迭代到n。但是,并非所有通过循环体的路径都为encryptedPass[i]分配任何内容-对于最后一个else if以及没有任何if条件都匹配的情况就是这种情况。对于第二个功能也是如此,但对于Password1[i]

但是,在每个函数的末尾,您都会无条件打印这些数组中的所有值,这意味着它们是未初始化的值。 (并且您迭代到未知值b6b7,而您可能应该迭代到您在第一个循环中使用的同一n。)

要解决此问题,请确保每次迭代都向索引中写入内容,或者确保有单独的写入位置索引或指针,并且仅在您写入内容时将其前进。

答案 2 :(得分:0)

尤其是对于Arkku,谢谢大家的回答。 这很有帮助。 我修复了它,现在工作正常。 在“ else if(ap == 0 && bp == 0)”之后的最后一个条件中,我添加了“ i = i-1”,以便在同一位置进行迭代。

这就是我所做的:

<!DOCTYPE html>
<html>
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body data-spy="scroll" data-target=".navbar" data-offset="50">

<nav class="navbar navbar-inverse navbar-fixed-top">
  <div class="container-fluid">
    <div class="navbar-header">
        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>                        
      </button>
      <a class="navbar-brand" href="#">WebSiteName</a>
    </div>
    <div>
      <div class="collapse navbar-collapse" id="myNavbar">
        <ul class="nav navbar-nav">
          <li><a href="#section1">Section 1</a></li>
          <li><a href="#section2">Section 2</a></li>
          <li><a href="#section3">Section 3</a></li>
          <li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#">Section 4 <span class="caret"></span></a>
            <ul class="dropdown-menu">
              <li><a href="#section41">Section 4-1</a></li>
              <li><a href="#section42">Section 4-2</a></li>
            </ul>
          </li>
        </ul>
      </div>
    </div>
  </div>
</nav>    

<div id="section1" class="container-fluid">
  <h1>Section 1</h1>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section2" class="container-fluid">
  <h1>Section 2</h1>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section3" class="container-fluid">
  <h1>Section 3</h1>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section41" class="container-fluid">
  <h1>Section 4 Submenu 1</h1>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section42" class="container-fluid">
  <h1>Section 4 Submenu 2</h1>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>

</body>
</html>

那解决了这个问题。

与其他功能相同:

for (i2 = 0; i2 < n; i2++) {
if (ap > 0) {
    Password1[i2] = encryptedPass5[i2] - longKey2[i2];
    ap--;
}
else if (bp > 0) {
    Password1[i2] = longKey2[i2] - encryptedPass5[i2];
    bp--;
}
else if (ap == 0 && bp == 0) {
    ap = a;
    bp = b;
    i = i - 1;
}

当我进行反向加密时,加密时不再显示“ -858993460”,在打印密码时也不再显示“╠╠╠╠╠╠╠╠”。

再次感谢大家,对于原信息的冗长,我们深表歉意。 下次我将考虑到这一点。

cd