~~ 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函数?
1条答案
按热度按时间uklbhaso1#
“* 或者有没有其他方法可以代替strcat函数?*”
是的还有另一种方法...
下面的代码执行您所描述的操作。为了简单起见,原始文本是 * 硬编码的 *,而不是从文件中读取。(将其替换为
fgetc()
,一次读取一个字符。)输出将打印到stdout
。(将其替换为fprintf()
。)然后添加源字符和输出字符的计数器。
EDIT注意到OP示例在扩展目标字符的两端重复使用了相同的大小写。使代码更加简单...