反转字符直到 EOF
Reversing characters until EOF
我正在创建一个程序来使用 getchar
反转行(每个字符)。
这就是我到目前为止所得到的(我的代码有点乱,因为我是初学者)。
#include <stdio.h>
#define MAX_CH 256
int main(void)
{
int ch = 0;
int i = 0;
int string[MAX_CH] = {0};
while (ch != '\n')
{
ch = getchar();
string[i] = ch;
++i;
}
i = i - 2; // put i back to the position of the last character
int limit = i;
int n;
int reverse[MAX_CH] = {0};
for (n = 0; n <= limit; ++n)
{
reverse[n] = string[i];
--i;
}
for (n = 0; n <= limit; ++n)
{
printf("%c", reverse[n]);
}
return 0;
}
然而,此代码仅适用于 1 行。我想升级它以便能够立即读取和打印反向文本并处理多行直到它到达 EOF。我怎样才能做到这一点?我尝试在 while (ch != '\n')
之外放置 1 个更大的循环 while (ch != EOF)
但那没有用。
感谢您的提前帮助。
您可以使用如下循环:
do {
i=0;
while ((ch=getchar())!=EOF && ch!='\n') {
string[i++] = ch;
}
string[i] = '[=10=]'; // terminate it
for (int j=0, i--; j<i; j++, i--) { // reverse line
char tmp= string[j];
string[j]= string[i];
string[i]= tmp;
}
} while (ch != EOF);
这是一个更通用的版本。从文件或标准输入中读取,支持任何行长度(至少在 realloc 失败之前)。
char *reverse(char *str)
{
size_t len = strlen(str);
for (size_t pos = 0; pos < len / 2; pos++)
{
char tmp = str[pos];
str[pos] = str[len - 1 - pos];
str[len - 1 - pos] = tmp;
}
return str;
}
#define MEMINC 80
int PrintReversedLines(char *filename)
{
FILE *fi = !strcmp(filename, "stdin") ? stdin : fopen(filename, "rt");
char *tmpbuff = NULL, *buff = NULL;
size_t pos = 0;
int ch = 0;
if (!fi) return -1;
while ((ch = fgetc(fi)) != EOF)
{
if (!(pos % MEMINC))
{
if (!(tmpbuff = realloc(buff, pos + 80)))
{
if (buff) free(buff);
return -1;
}
else
{
buff = tmpbuff;
}
}
if (ch == '\r') continue;
if (ch == '\n')
{
buff[pos++] = 0;
printf("%s\n", reverse(buff));
free(buff);
buff = NULL;
pos = 0;
}
else
{
buff[pos++] = ch;
}
}
return 0;
}
int main()
{
PrintReversedLines("stdin");
}
只要您能阅读输入行,您想重复代码。
这里有几个问题需要解决
- 数组不需要
int
类型,char
类型是更合适的选择。
- 在反转行后输出一个换行符。
- 你不需要一个单独的数组来存储反转的行,你可以从
string
数组中以相反的顺序打印字符。
- 为了简单起见,您可以使用
putchar
而不是 printf
这是修改后的版本:
#include <stdio.h>
#define MAX_CH 256
int main(void) {
int ch, i, length;
char string[MAX_CH];
for (;;) {
for (i = 0; i < MAX_CH; i++) {
if ((ch = getchar()) == EOF || (ch == '\n'))
break;
string[i] = ch;
}
length = i;
if (length == 0) {
/* no character read => EOF */
break;
}
for (i = 0; i < length; i++) {
putchar(string[length - i - 1]);
}
putchar('\n');
}
return 0;
}
我正在创建一个程序来使用 getchar
反转行(每个字符)。
这就是我到目前为止所得到的(我的代码有点乱,因为我是初学者)。
#include <stdio.h>
#define MAX_CH 256
int main(void)
{
int ch = 0;
int i = 0;
int string[MAX_CH] = {0};
while (ch != '\n')
{
ch = getchar();
string[i] = ch;
++i;
}
i = i - 2; // put i back to the position of the last character
int limit = i;
int n;
int reverse[MAX_CH] = {0};
for (n = 0; n <= limit; ++n)
{
reverse[n] = string[i];
--i;
}
for (n = 0; n <= limit; ++n)
{
printf("%c", reverse[n]);
}
return 0;
}
然而,此代码仅适用于 1 行。我想升级它以便能够立即读取和打印反向文本并处理多行直到它到达 EOF。我怎样才能做到这一点?我尝试在 while (ch != '\n')
之外放置 1 个更大的循环 while (ch != EOF)
但那没有用。
感谢您的提前帮助。
您可以使用如下循环:
do {
i=0;
while ((ch=getchar())!=EOF && ch!='\n') {
string[i++] = ch;
}
string[i] = '[=10=]'; // terminate it
for (int j=0, i--; j<i; j++, i--) { // reverse line
char tmp= string[j];
string[j]= string[i];
string[i]= tmp;
}
} while (ch != EOF);
这是一个更通用的版本。从文件或标准输入中读取,支持任何行长度(至少在 realloc 失败之前)。
char *reverse(char *str)
{
size_t len = strlen(str);
for (size_t pos = 0; pos < len / 2; pos++)
{
char tmp = str[pos];
str[pos] = str[len - 1 - pos];
str[len - 1 - pos] = tmp;
}
return str;
}
#define MEMINC 80
int PrintReversedLines(char *filename)
{
FILE *fi = !strcmp(filename, "stdin") ? stdin : fopen(filename, "rt");
char *tmpbuff = NULL, *buff = NULL;
size_t pos = 0;
int ch = 0;
if (!fi) return -1;
while ((ch = fgetc(fi)) != EOF)
{
if (!(pos % MEMINC))
{
if (!(tmpbuff = realloc(buff, pos + 80)))
{
if (buff) free(buff);
return -1;
}
else
{
buff = tmpbuff;
}
}
if (ch == '\r') continue;
if (ch == '\n')
{
buff[pos++] = 0;
printf("%s\n", reverse(buff));
free(buff);
buff = NULL;
pos = 0;
}
else
{
buff[pos++] = ch;
}
}
return 0;
}
int main()
{
PrintReversedLines("stdin");
}
只要您能阅读输入行,您想重复代码。
这里有几个问题需要解决
- 数组不需要
int
类型,char
类型是更合适的选择。 - 在反转行后输出一个换行符。
- 你不需要一个单独的数组来存储反转的行,你可以从
string
数组中以相反的顺序打印字符。 - 为了简单起见,您可以使用
putchar
而不是printf
这是修改后的版本:
#include <stdio.h>
#define MAX_CH 256
int main(void) {
int ch, i, length;
char string[MAX_CH];
for (;;) {
for (i = 0; i < MAX_CH; i++) {
if ((ch = getchar()) == EOF || (ch == '\n'))
break;
string[i] = ch;
}
length = i;
if (length == 0) {
/* no character read => EOF */
break;
}
for (i = 0; i < length; i++) {
putchar(string[length - i - 1]);
}
putchar('\n');
}
return 0;
}