C 从给定参数的文件中反转行

C 从给定参数的文件中反转行,c,string,function,file,C,String,Function,File,我必须编写一个函数void reverse_file(file*file),将参数文件中的行一次读取一行到本地字符数组缓冲区中,该缓冲区的大小#定义为预处理器常量MAXLINE。对于每一行,该函数调用上一个reverse_string函数来反转该行,然后在标准输出中写入反转的行 我有反向的字符串方法 #include <stdio.h> #include <stdlib.h> #include <string.h> void reverse_String(c

我必须编写一个函数void reverse_file(file*file),将参数文件中的行一次读取一行到本地字符数组缓冲区中,该缓冲区的大小#定义为预处理器常量MAXLINE。对于每一行,该函数调用上一个reverse_string函数来反转该行,然后在标准输出中写入反转的行

我有反向的字符串方法

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

void reverse_String(char* str);
int main()
{
    char str [256];
    strcpy_s(str, "Hello");
    reverse_String(str);
    return 0;
}
void reverse_String(char* str)
{
    int i, j;
    char temp;
    i=j=temp=0;

    j=strlen(str)-1;
    for (i=0; i<j; i++, j--)
    {
        temp=str[i];
        str[i]=str[j];
        str[j]=temp;
    }
    printf("%s",str);
}
#包括
#包括
#包括
无效反向_字符串(char*str);
int main()
{
char-str[256];
strcpy_s(str,“你好”);
反向_字符串(str);
返回0;
}
无效反向_字符串(char*str)
{
int i,j;
焦炭温度;
i=j=temp=0;
j=strlen(str)-1;

对于(i=0;i可能是这样的

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

void reverse_String(char* str)
{
    int i, j;
    char temp;
    i=j=temp=0;

    j=strlen(str)-1;
    for (i=0; i<j; i++, j--) {
        temp=str[i];
        str[i]=str[j];
        str[j]=temp;
    }
    printf("%s",str);
 }

 void reverse_File(FILE* file) {
     char* line;
     size_t len = 0;
     ssize_t read;

     while ((read = getline(&line, &len, file)) != -1) {
        reverse_String(line);
     }
 }

int main(void) {

    FILE * fp;

    fp = fopen("Maze.txt", "r");

    if (fp == NULL)
        exit(EXIT_FAILURE);

    reverse_File(fp);
}
#包括
#包括
#包括
无效反向_字符串(char*str)
{
int i,j;
焦炭温度;
i=j=temp=0;
j=strlen(str)-1;

对于(i=0;i可能是这样的

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

void reverse_String(char* str)
{
    int i, j;
    char temp;
    i=j=temp=0;

    j=strlen(str)-1;
    for (i=0; i<j; i++, j--) {
        temp=str[i];
        str[i]=str[j];
        str[j]=temp;
    }
    printf("%s",str);
 }

 void reverse_File(FILE* file) {
     char* line;
     size_t len = 0;
     ssize_t read;

     while ((read = getline(&line, &len, file)) != -1) {
        reverse_String(line);
     }
 }

int main(void) {

    FILE * fp;

    fp = fopen("Maze.txt", "r");

    if (fp == NULL)
        exit(EXIT_FAILURE);

    reverse_File(fp);
}
#包括
#包括
#包括
无效反向_字符串(char*str)
{
int i,j;
焦炭温度;
i=j=temp=0;
j=strlen(str)-1;

对于(i=0;i),您已经有了一个很好的答案,但是有几个微妙的点需要考虑。如果您使用面向行的输入方法(<代码> fGe< <代码> >或<代码> GETLINE >),您应该删除<代码> \n′/代码>或<代码> \ r\n’/c>(DoS/Windows)。通过
fgets
getline
读取并包含在原始行中的行尾(这就是为什么原始文件的输出中有一个初始空行)

删除行尾的一种简单方法是简单地覆盖nul终止字符遇到的任一行尾中的第一个。为此,您的主程序逻辑如下所示:

while (fgets (str, MAXC, fp)) {     /* read each line */
    rmcrlf (str);                   /* trim \r or \n  */
    strrev (str);                   /* reverse string */
    printf ("%s\n", str);           /* output reverse */
}
您的
rmcrlf
(删除回车换行符)可能如下所示:

/** stip trailing newlines and carraige returns by overwriting with
 *  null-terminating char. 's' is modified in place.
 */
void rmcrlf (char *s)
{
    if (!s || !*s) return;          /* validate not NUL and not empty */
    char *p = strpbrk (s, "\r\n");  /* locate first line-ending char  */
    *p = 0;                         /* set to nul-terminating char    */
}
(注意:您可以使用
strlen
(或指针和循环)查找字符串的结尾并向后工作,但是
strpbrk
允许您向前搜索
'\n'
'\r'
,而无需查找结尾并向后工作)

然后,您可以用同样的方法将字符串反转到位(但使用
strrchr
来查找结尾,而不是
strlen

您可以按如下方式将所有部分放在一起。这只是完成相同任务的另一种方式。注意:以下代码使用
枚举
而不是
#define
来设置和定义常量(仅显示备用方法)。另外,请注意:代码将从作为第一个参数给定的文件中读取(如果未提供文件名,则默认情况下从
stdin
):

输出

$ cat dat/strtorev.txt
abc def ghi jkl mno pqr
ABC DEF GHI JKL MNO PQR
$ ./bin/strrev_line <dat/strtorev.txt
rqp onm lkj ihg fed cba
RQP ONM LKJ IHG FED CBA

<代码> $/bin /StruvyLINE

您已经有了一个很好的答案,但是有几个微妙的点需要考虑。如果您使用的是面向行的输入方法(<代码> fGe< <代码> >或<代码> GETLINE >),您应该删除<代码> \n′/代码>或<代码> \ r\n’/c>(DoS/Windows)通过

fgets
getline
读取并包含在原始行中的行尾(这就是为什么原始文件的输出中有一个初始空行)

删除行尾的一种简单方法是简单地覆盖nul终止字符遇到的任一行尾中的第一个。为此,您的主程序逻辑如下所示:

while (fgets (str, MAXC, fp)) {     /* read each line */
    rmcrlf (str);                   /* trim \r or \n  */
    strrev (str);                   /* reverse string */
    printf ("%s\n", str);           /* output reverse */
}
您的
rmcrlf
(删除回车换行符)可能如下所示:

/** stip trailing newlines and carraige returns by overwriting with
 *  null-terminating char. 's' is modified in place.
 */
void rmcrlf (char *s)
{
    if (!s || !*s) return;          /* validate not NUL and not empty */
    char *p = strpbrk (s, "\r\n");  /* locate first line-ending char  */
    *p = 0;                         /* set to nul-terminating char    */
}
(注意:您可以使用
strlen
(或指针和循环)查找字符串的结尾并向后工作,但是
strpbrk
允许您向前搜索
'\n'
'\r'
,而无需查找结尾并向后工作)

然后,您可以用同样的方法将字符串反转到位(但使用
strrchr
来查找结尾,而不是
strlen

您可以按如下方式将所有部分放在一起。这只是完成相同任务的另一种方式。注意:以下代码使用
枚举
而不是
#define
来设置和定义常量(仅显示备用方法)。另外,请注意:代码将从作为第一个参数给定的文件中读取(如果未提供文件名,则默认情况下从
stdin
):

输出

$ cat dat/strtorev.txt
abc def ghi jkl mno pqr
ABC DEF GHI JKL MNO PQR
$ ./bin/strrev_line <dat/strtorev.txt
rqp onm lkj ihg fed cba
RQP ONM LKJ IHG FED CBA

$/bin/strev\u line假设您有一个三行文件:
abc
def
ghi
。您是否需要输出
cba
fed
ihg
,或
ghi
def
abc
,或者可能是
ihg
cba
在输出时,您需要查找标准C或POSIX来读取输入行。然后在适当的时候调用反转字符串函数。请注意,通常最好将输出与反转分开。此外,
printf(str)
不好-非常不好。您应该使用
printf(“%s\n”,str)
put(str)
。危险在于您正在打印的字符串将包含
%
序列,并且您没有为
printf()提供参数
处理那些
%s
序列。@JonathanLeffler第二个。abc变为CBA您似乎缺少
#define
。您似乎打算将每行允许的最大字符数作为define。您将需要类似于
#define MAXC 256
(紧接在
#include…
语句下,然后
char str[MAXC]=”;
使用它。(注意:您希望使用
定义
而不是幻数(例如
256
)分散在代码中。您也可以使用
枚举
来定义相同的常量,而不是
#define
,例如
enum{MAXC=256};
@DavidC.Rankin完全忘记了这一点,感谢manSuppose,您有一个包含三行的文件:
abc
def
ghi