gpt4 book ai didi

c - K&R 练习 1-19 : Reverse Char Array

转载 作者:太空宇宙 更新时间:2023-11-04 04:28:20 27 4
gpt4 key购买 nike

我可以很好地反转数组,但是当我在终端中执行 CTRL+D(EOF) 时,我无法让程序终止。
我能让程序终止的唯一方法是,如果我在编译后做的第一件事就是执行 CTRL+D。但是如果我输入一个字符串,那么之后 CTRL+D 将不起作用。

我不太确定我的错误在哪里。

#include <stdio.h>
#define MAXLINE 1000 // Maximum input.

// ----------------- reverseLine -----------------
// This method reads in chars to be put into an
// array to make a string. EOF and \n are the
// delimiters on the chars, then \0 is the
// delimiter for the string itself. Then the
// array is swapped in place to give the reverse
// of the string.
//------------------------------------------------
int reverseLine(char s[], int lim)
{
int c, i, newL;
// c is the individual chars, and i is for indices of the array.
for (i = 0; i < lim - 1 && (c=getchar()) != EOF && c != '\n'; ++i)
{
s[i] = c;
}

if (c == '\n') // This lets me know if the text ended in a new line.
{
newL = 1;
}

// REVERSE
int toSwap;
int end = i-1;
int begin = 0;
while(begin <= end) // Swap the array in place starting from both ends.
{
toSwap = s[begin];
s[begin] = s[end];
s[end] = toSwap;

--end;
++begin;
}

if (newL == 1) // Add the new line if it's there.
{
s[i] = '\n';
++i;
}

s[i] = '\0'; // Terminate the string.

return i;
}

int main()
{
int len;
char line[MAXLINE];

while ((len = reverseLine(line, MAXLINE)) > 0) // If len is zero, then there is no line to recored.
{
printf("%s", line);
}

return 0;
}

我唯一能想到的是 main 中的 while 循环检查是否 len > 0,所以如果我键入 EOF,也许它无法进行有效比较?但是,当这是我输入的第一个也是唯一的内容时,就无法理解为什么它会起作用。

最佳答案

由于这种情况,您的程序永远不会读取 EOF:

(c=getchar()) != EOF && c != '\n';

一旦 c 等于 '\n' 循环就终止并且后面的所有字符都将被忽略。我认为您应该将输入与行反转分开,并对反转函数参数进行常规检查。

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

#define SIZE_MAX (256U)

static bool linereverse(char *line);
static bool deletenewline(char *s);

int main(void)
{
char buff[SIZE_MAX];
bool success;
(void) fputs("Enter a string: ", stdout);
if( NULL == fgets(buff,(size_t) SIZE_MAX, stdin))
{
(void) fputs("Error: invalid input!\n",stderr);
return EXIT_FAILURE;
}
success = deletenewline(buff);
if(false == success)
{
(void) fputs("Error: cannot remove newline\n",stderr);
return EXIT_FAILURE;
}
success = linereverse(buff);
if(false == success)
{
(void) fputs("Error: cannot reverse the line");
return EXIT_FAILURE;
}
(void) fputs("The line reversed is: ", stdout);
(void) fputs(buff, stdout);
(void) puchar('\n');
return EXIT_SUCCESS;
}
static bool linereverse(char *line)
{
size_t i;
size_t j;
char tmp;
if(NULL == line)
{
return false;
}
i = 0;
j = strlen(line) - 1;
while(i < j)
{
tmp = line[i];
line[i] = line[j];
line[j] tmp;
++i;
--j;
}
return true;
}
static bool deletenewline(char *s)
{
char *p;
if(NULL == s)
{
return false;
}
p = strrchr(s,'\n');
if(NULL != p)
{
*p = '\0';
}
return true;
}

关于c - K&R 练习 1-19 : Reverse Char Array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39069433/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com