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