c - C中的按位运算伪造文件内容

标签 c scanf atof binary-operators

我有这个小程序可以从 allomany.txt。它包含一个长文本,其中我们有一些数字。现在我需要伪造每个数字:假设程序需要从文件中读取文本并我需要找到一个数字(数字是字符串)。然后我需要检查字符串是否是数字。如果是,那么我需要使用按位运算来伪造它。

伪造:如果我在 string(atoi, sscanf) 中找到一个数字,那么我需要递增在字符串中找到的数字。示例:如果程序找到 14,我们使用按位运算将其增加 15。如果我没记错的话,我在网上找到了一个例子:(-(~n))。如果我不使用按位运算,它就可以工作。

问题:如何使用位运算来做到这一点?

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

int main()
{
    FILE *fin,*fout;
    char *token, s[1000];

    fin = fopen("allomany.txt","rt");
    fout = fopen("hamisitott.txt","wt");

    while (fscanf(fin, "%[^\n]\n", s) != EOF) {
        token = strtok(s, " ");
        while (token != NULL) {
            if (atof(token) > 0)
                fprintf(fout, "%g ", atof(token) + 1);
            else fprintf(fout, "%s ", token);
            token = strtok(NULL, " ");
        }
        fprintf(fout, "\n");
    }

    fclose(fin);
    fclose(fout);

    return EXIT_SUCCESS;
}

最佳答案

用按位运算增加数字似乎有点复杂,我建议一个简单的替代方法:通过翻转低位将文件中的每个数字从偶数更改为奇数,反之亦然:

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

int main(void) {
    FILE *fin = fopen("allomany.txt", "r");
    FILE *fout = fopen("hamisitott.txt", "w");
    int c;

    if (fin == NULL || fout == NULL) {
        fprintf(stderr, "cannot open files\n");
        exit(EXIT_FAILURE);
    }
    while ((c = getc(fin)) != EOF) {
        if (c >= '0' && c <= '9')
            c = '0' + ((c - '0') ^ 1);
        putc(c, fout);
    }
    fclose(fin);
    fclose(fout);

    return EXIT_SUCCESS;
}

您还可以使用不同的表达式(但没有按位运算)实现其他数字排列:

c = "9876543210"[c - '0'];

编辑 我将 c ^= 1 更改为 c = '0' + ((c - '0') ^ 1) 为避免假设 '0' 是偶数。 C 标准仅保证数字 '0''9' 相邻且严格为正数。

关于c - C中的按位运算伪造文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35877871/

相关文章:

c - 如何从accept调用获取套接字端口号(C UNIX)

c - fscanf 的奇怪异常和变量声明的顺序

c++ - 使用 atof 将字符串转换为 float 在末尾产生非常小的十进制数

c - OpenGL 正射投影被破坏

c - C 平台(H/W + S/W)是依赖的还是独立的

将温度从摄氏温度转换为华氏温度

c++ - 从 stringstream 中提取到 2D vector 中

ansi c中的转换问题

c - LD_PRELOAD 哪个程序是目标

c - printf/scanf 的输入/输出选项