~~ z_goggamal-input.txt ~~
给我做个三明治
什么?自己做。
须藤给我做个三明治
好的。
这是原始文本文件。我需要更改此文件
~~像这样~~
给我做一个三明治。
什么?让它成为你自己。
SoSudo 给我做个三明治
好的。
表示辅音变'
所以我在给定的代码上添加 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文件时,没有错误但没有任何改变。
输出与原始文件相同。
我应该如何编辑代码来制作
或者我可以使用其他方法代替 srtcat 函数吗?
“或者我可以使用其他方法代替 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 示例对正在扩展的目标字符的“两端”重复使用相同的大小写。使代码更简单......