C 输出中的随机字节

Random Bytes In C Output

我刚刚用 C 编写了我的第一个程序,它是剖腹产的实现。它在短输入下按预期工作,但有时会在输出的和处产生看似随机的字节,我无法弄清楚原因。

我已经尝试查看 GDB 中的程序,但还没有足够的经验来找出到底出了什么问题。我很想知道如何使用像 GDB 这样的调试器解决这个问题。

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

void rot(char*, int);

char alphabet[27] = "abcdefghijklmnopqrstuvwxyz";

int main (int argc, char* argv[]) {
    if (argc != 3) {
        printf("Usage: %s [lowercase-text] [rotation-number]\n", argv[0]);
        return 1;
    } else {
        rot(argv[1], atoi(argv[2]));
    }
}


void rot (char* t, int r) {
    char result[100];
    for (int i = 0; i < strlen(t); i++) {
        char* location = strchr(alphabet, t[i]);
        result[i] = location ? alphabet[(location - alphabet + r) % strlen(alphabet)] : t[i];
    }
    printf("%s\n", result);
}

这是意外的输出。实际旋转工作正常,但最后有一些意外字节。

michael@linux:~/Desktop$ ./rotation 
Usage: ./rotation [lowercase-text] [rotation-number]
michael@linux:~/Desktop$ ./rotation rotations_are_cool 13
ebgngvbaf_ner_pbby��� (<- Why are these here ???)

这是我对 GDB 的尝试。最后我无法识别额外的数据标记。 (完整输出@https://pastebin.com/uhWnj17e

(gdb) break *rot+260
Breakpoint 1 at 0x936: file ../rot.c, line 25.
(gdb) r rotations_are_cool 13
Starting program: /home/michael/Desktop/rotation rotations_are_cool 13

Breakpoint 1, 0x0000555555554936 in rot (
    t=0x7fffffffe2d2 "rotations_are_cool", r=13) at ../rot.c:25
25      printf("%s\n", result);
(gdb) x/s $rbp-0x80
0x7fffffffdde0: "ebgngvbaf_ner_pbby7777"

这种奇怪的情况只发生在大约 50% 的时间内,并且在字符串较长的情况下更常发生。请帮助解释并消除这一点。也感谢任何其他可以改进我的代码的技巧。谢谢一打!

字符串的结尾由字符“\0”识别。

所以你可以这样做

    char result[100];
    int i;
    for (i = 0; i < strlen(t); i++) {
        char* location = strchr(alphabet, t[i]);
        result[i] = location ? alphabet[(location - alphabet + r) % strlen(alphabet)] : t[i];
    }
    result[i] = '[=10=]';

你也不检查,result 对字符串来说足够大,所以你可以动态分配所需的内存

    size_t len = strlen(t)
    char *result = malloc(len + 1); /* +1 for terminating '[=11=]' character */
    if(result == NULL) {
        /* Error allocating memory */
    }
    int i;
    for (i = 0; i < len; i++) {
        char* location = strchr(alphabet, t[i]);
        result[i] = location ? alphabet[(location - alphabet + r) % strlen(alphabet)] : t[i];
    }
    result[i] = '[=11=]';
    printf("%s\n", result);
    free(result);