使用 srtcat() 添加字符串到字符串的问题

问题描述 投票:0回答:1

~~ z_goggamal-input.txt ~~

给我做个三明治

什么?自己做。

须藤给我做个三明治

好的。

这是原始文本文件。我需要更改此文件

~~像这样~~
给我做一个三明治。

什么?让它成为你自己。

SoSudo 给我做个三明治

好的。

表示辅音变' o ',只需要转换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 函数将“或”放在“r”之后

但是当我编译后查看txt文件时,没有错误但没有任何改变。

输出与原始文件相同。

我应该如何编辑代码来制作o

或者我可以使用其他方法代替 srtcat 函数吗?

c buffer strcat
1个回答
1
投票

或者我可以使用其他方法代替 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': printf( "%co", *src );
            /* FALLTHROUGH */
            default: putchar( *src ); break;
        }

    return 0;
}

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.