使用srtcat()将字符串添加到字符串时出现问题

1wnzp6jl  于 2023-03-22  发布在  其他
关注(0)|答案(1)|浏览(253)

~~ z_goggamal-input. txt ~~
给我做个三明治。
什么?你自己做。
须藤给我做个三明治。
好的。
这是原始的文本文件.我需要改变这个文件
~~像这样~~
给我做个三明治。
什么?你自己做。
素须藤给我做了个素三文治。
好的。
这意味着辅音被改变为‘〇’,仅需要转换3**辅音,**具体地是R、S和T(小写和大写两者)。
所以我在给定的代码中添加transform_char()。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

#define D_BUFSIZE 4096
#define NUM_ARGS_3 3
#define NUM_ARGS_4 4

#define ERROR_ARGS 1
#define ERROR_OPEN_R 2
#define ERROR_OPEN_W 3
#define ERROR_WRITE 4
#define ERROR_CALLOC 5
#define SUCCESS 0
#define ERROR -1

int BUFSIZE = D_BUFSIZE;

// Function to transform a character to Goggamal language
char transform_char(char c) {
        if (c == 'r'){
        char or[10] = "or";
        char plusr[10] = "r";
        strcat (plusr,or);
        return *plusr;
    }
 }

int main(int argc, char *argv[]) {
    char *prog_name = strdup(argv[0]);
    int input_fd, output_fd;
    ssize_t return_num_bytes_write, return_num_bytes_read;
    char *buffer;
    char *fn = strdup("makegoggamalA");

    if (argc != NUM_ARGS_3 && argc != NUM_ARGS_4) {
        printf("%s: usage: makegoggamalA source_file target_file [BUFSIZE]\n", prog_name);
        return ERROR_ARGS;
    }

    if (argc == NUM_ARGS_4) {
        BUFSIZE = atoi(argv[3]);
    }

    if (argc == NUM_ARGS_3) {
        BUFSIZE = 1;
    }

    buffer = (char *) calloc(BUFSIZE, sizeof(char));
    if (buffer == NULL) {
        perror("calloc");
        return ERROR_CALLOC;
    }

    input_fd = open(argv[1], O_RDONLY);
    if (input_fd == ERROR) {
        perror("open");
        return ERROR_OPEN_R;
    }

    output_fd = open(argv[2], O_WRONLY | O_CREAT, 0644);
    if (output_fd == ERROR) {
        perror("open");
        return ERROR_OPEN_W;
    }

    int total_read = 0;
    int total_write = 0;

    while ((return_num_bytes_read = read(input_fd, buffer, BUFSIZE)) > 0) {
        for (int i = 0; i < return_num_bytes_read; i++) {
            buffer[i] = transform_char(buffer[i]);
        }
        return_num_bytes_write = write(output_fd, buffer, (ssize_t) return_num_bytes_read);
        if (return_num_bytes_read != return_num_bytes_write) {
            perror("write");
            return ERROR_WRITE;
        }
        total_read += return_num_bytes_read;
        total_write += return_num_bytes_write;
    }

    close(input_fd);
    close(output_fd);
    free(buffer);
    free(prog_name);
    printf("read %'d bytes and wrote %'d bytes done...\n", total_read, total_write);
    return SUCCESS;
}

我只做了“r”这个角色。
我想我可以用strcat函数把“or”放在“r”后面
但是当我在编译后检查txt文件时,没有错误,但没有任何变化。
输出与原始文件相同。
我应该做什么来编辑代码来制作o?
或者有没有其他方法可以使用srtcat函数?

uklbhaso

uklbhaso1#

“* 或者有没有其他方法可以代替strcat函数?*”
是的还有另一种方法...
下面的代码执行您所描述的操作。为了简单起见,原始文本是 * 硬编码的 *,而不是从文件中读取。(将其替换为fgetc(),一次读取一个字符。)输出将打印到stdout。(将其替换为fprintf()。)

#include <stdio.h>

int main( void ) {
    char *src =
        "Make me a sandwich.\n"
        "What? Make it yourself.\n"
        "Sudo make me a sandwich.\n"
        "Okay.\n";

    for( ; *src; src++ )
        switch( *src ) {
            case 'r':
            case 'R':
            case 's':
            case 'S':
            case 't':
            case 'T':
                putchar( *src );
                putchar( 'o' );
            /* FALLTHROUGH */
            default:
                putchar( *src );
                break;
        }

    return 0;
}

然后添加源字符和输出字符的计数器。

Make me a sosandwich.
Whatot? Make itot yourorsoself.
SoSudo make me a sosandwich.
Okay.

EDIT注意到OP示例在扩展目标字符的两端重复使用了相同的大小写。使代码更加简单...

相关问题