c - 为什么那个功能不起作用?

标签 c file-io character-encoding

我正在尝试编写一个能够用另一个字符替换特定字符的函数。 但是..输出有点奇怪..我不明白。 我提供的代码可以无错编译:

#include <stdio.h>
#include <windows.h>

int main()
{
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
    WORD saved_attributes;

    char file_name[256];
    FILE* fp;
    int ch, i=0, l=0;
    unsigned char buff[2048];

    /* Save current attributes */
    GetConsoleScreenBufferInfo(hConsole, &consoleInfo);
    saved_attributes = consoleInfo.wAttributes;

    printf("Enter File Name: ");
    scanf("%s", &file_name);

    fp = fopen(file_name, "r+a");

    printf("\n Printing file character by character..\n");

    for ( ; ; )
    {
        l++;
        ch = fgetc(fp);
        SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE);
        printf("%c", ch); buff[l] = ch;
        SetConsoleTextAttribute(hConsole, saved_attributes);
        if(ch == EOF) break;
    }

    printf("\n\n Converting..\n");

    for( ; i<ftell(fp); i++)
    {
if(buff[i] == '1') buff[i] = '8';
if(buff[i] == '2') buff[i] = '9';
if(buff[i] == '3') buff[i] = '0';
if(buff[i] == '4') buff[i] = '-';
if(buff[i] == '5') buff[i] = '=';
if(buff[i] == '6') buff[i] = 'q';
if(buff[i] == '7') buff[i] = 'w';
if(buff[i] == '8') buff[i] = 'e';
if(buff[i] == '9') buff[i] = 'r';
if(buff[i] == '0') buff[i] = 't';

if(buff[i] == 'q') buff[i] = 'y';
if(buff[i] == 'w') buff[i] = 'u';
if(buff[i] == 'e') buff[i] = 'i';
if(buff[i] == 'r') buff[i] = 'o';
if(buff[i] == 't') buff[i] = 'p';
if(buff[i] == 'y') buff[i] = '[';
if(buff[i] == 'u') buff[i] = ']';
if(buff[i] == 'i') buff[i] = 'a';
if(buff[i] == 'o') buff[i] = 's';
if(buff[i] == 'p') buff[i] = 'd';

if(buff[i] == 'a') buff[i] = 'f';
if(buff[i] == 's') buff[i] = 'g';
if(buff[i] == 'd') buff[i] = 'h';
if(buff[i] == 'f') buff[i] = 'j';
if(buff[i] == 'g') buff[i] = 'k';
if(buff[i] == 'h') buff[i] = 'l';
if(buff[i] == 'j') buff[i] = ';';
if(buff[i] == 'k') buff[i] = '\'';
if(buff[i] == 'l') buff[i] = '\\';

if(buff[i] == 'z') buff[i] = 'z';
if(buff[i] == 'x') buff[i] = 'z';
if(buff[i] == 'c') buff[i] = 'x';
if(buff[i] == 'v') buff[i] = 'c';
if(buff[i] == 'b') buff[i] = 'v';
if(buff[i] == 'n') buff[i] = 'b';
if(buff[i] == 'm') buff[i] = 'n';
    }
    SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE);
    printf("%s\n", buff);
    SetConsoleTextAttribute(hConsole, saved_attributes);
    printf("\n Saving..");
    fclose(fp);
    {
        FILE* fp = fopen(file_name, "w");
        fputs(buff, fp);
    }
}

我正在使用以下文件对其进行测试:

f l k [j6] 0 e r k l x [k0] r u I o k v C [x8]
w t y u C v n C Q r y I z x [c9] e y x [x0]
r [zu] l k [l6] 0 e r j k [lq] t i z [kw] y [hi] [j6] 0 e r t

但我得到的结果是:

(; \ ' [;[] \ ; ' ' \ z ['\] ' ] I ' ' c C [z;]
] \ [ ] C c b C Q ' [ I z z [x'] ; [ z [z\]
' [z]] \ ' [\[] \ ; ' ; ' [\[] \ ; z [']] [ [\;] [;[] \ ; ' \я

这是怎么回事?

最佳答案

您的角色在同一个周期内被替换多次。考虑 buff[i] == '1' 的情况。让我们检查一下循环中的语句,看看会发生什么。

if(buff[i] == '1') buff[i] = '8'; // Now, buff[i] is '8'
if(buff[i] == '2') buff[i] = '9'; // Nothing happens
if(buff[i] == '3') buff[i] = '0'; // Nothing happens
if(buff[i] == '4') buff[i] = '-'; // wait for it...
if(buff[i] == '5') buff[i] = '=';
if(buff[i] == '6') buff[i] = 'q';
if(buff[i] == '7') buff[i] = 'w';
if(buff[i] == '8') buff[i] = 'e'; // Now, buff[i] is 'e'
// ...
if(buff[i] == 'e') buff[i] = 'i'; // Now, buff[i] is 'i'
// ...
if(buff[i] == 'i') buff[i] = 'a'; // Now, buff[i] is 'a'
// ... and so on

请注意,这一切都发生在循环的一个周期内。所以 '1' 被编码为 ';'而不是“8”,这可能是您想要的。

您可能希望在所有这些 if(除了第一个)前加上一个 else

关于c - 为什么那个功能不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25452160/

相关文章:

c++ - 速度基于时间而不是 FPS

javascript - 是否有可能在发布之前重命名 html 文件输入的文件

c - 如何使用 stdio.h C 库读取文本文件并将内容写入另一个文本文件

java - 如何访问 BufferedWriter 中的缓冲区

python - 将 int 值转换为 unicode

ios - 原始字符串的特殊字符 - Objective C

c - 使用数组实现最小堆

c - 这里发生了什么?将数组中的值更改为空格

c++ - 挑战 - Arduino 返回多个数组

c - 为什么只有当可执行文件在 Visual Studio 下运行时 CreateFileA 才会失败?