gpt4 book ai didi

代码在 macOS 上逻辑上有效,但在 Ubuntu 16.04.5 上无效

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:36 26 4
gpt4 key购买 nike

我有一个任务要编写函数:

int read_palindrome();//输入来自标准输入

将从标准输入读取一行,如果该行是回文则返回 1,否则返回 0。一行以换行符 ('\n') 终止,并且不包括换行符。

需要满足的要求:

没有关于输入长度的假设。您也不允许读取输入两次,例如读取输入,忘记读取输入但记住长度,再次读取输入。这导致输入被读取两次。

您也不允许创建一个非常大的缓冲区来存储输入推理,因为输入行可能比一个非常大的缓冲区小。这个限制的原因是我们会考虑程序的内存使用。

任务是得出一个具有最佳 CPU 时间和内存使用率的正确程序。

以下是我的尝试。

文件1.c

#include <stdio.h>

extern int read_palindrome();

int main()
{
if (read_palindrome()) printf("input is a palindrome");
else printf("input is not a palindrome");
return 0;
}

文件2.c

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


int check_palindrome2(char *, int);

int read_palindrome() {
unsigned int len_max = 128;
unsigned int current_size = 0;
char *pStr = malloc(len_max);
current_size = len_max;
int i = 0;
char c;
if (pStr != NULL) {
while (( c = getchar() ) != '\n') {
pStr[i] = (char)c;
i++;
if(i == current_size) {
current_size += len_max;
char *tmp = realloc(pStr, current_size);
if (tmp == NULL) {
free(pStr);
return 2;
}
pStr = tmp;

}
}

pStr[i] = '\0';
free(pStr);

}
return check_palindrome2(pStr,i);
}


int check_palindrome2(char *s, int length) {
for (int i = 0; i < length; i++) {
if (s[i]!= s[length-i-1]) {
return 0;
}
}
return 1;
}

将文件复制到两台机器上后,在我的 MacOS 和 Ubuntu 上运行适当的编译命令,并输入一个已知的回文数 121。

gcc -c file1.c
gcc -c file2.c
gcc -o output file1.c file2.c
./output

代码在 MacOS 上打印 input is a palindrome 但在 Ubuntu 上打印 input is not a palindrome。任何人都可以告诉我我的代码是否有问题,或者应该是我应该在不同的操作系统上做不同的事情。

最佳答案

您的错误处理不一致。在一种情况下你返回 2,在另一种情况下你间接返回 1。这应该改变:

我将对错误使用负值:

int read_palindrome()
{
unsigned int len_max = 128;
unsigned int current_size = 0;
char *pStr = malloc(len_max);
current_size = len_max;
int i = 0;
char c;
if (pStr == NULL)
return -1;

while (( c = getchar() ) != '\n') {
pStr[i] = (char)c;
i++;
if(i == current_size) {
current_size += len_max;
char *tmp = realloc(pStr, current_size);
if (tmp == NULL) {
free(pStr);
return -1;
}
pStr = tmp;
}
}

pStr[i] = '\0';
free(pStr);
return check_palindrome2(pStr,i); // If pStr==NULL we do not reach this line.
}

现在您在任何错误情况下都返回了 -1,如果 pStrNULL,则您不会使用它。

让我们解决“释放后使用”问题:

    free(pStr);
return check_palindrome2(pStr,i);

在释放 pStr 之后访问它是非法的。重新安排函数调用。

    int retval = check_palindrome2(pStr,i);
free(pStr);
return retval;

除了这些更改之外,您还需要正确处理此函数的返回值:

int main() 
{
int pali = read_palindrome();

if (pali < 0)
printf("An error occured.\n");
else if (pali)
printf("Input is a palindrome\n");
else
printf("Input is no palindrome\n");
return 0;
}

最后让我们稍微加快回文检测速度:

int check_palindrome2(char *s, int length) 
{
for (int i = 0; i < length / 2; i++) // only walk up to the middle.
{
if (s[i] != s[length-i-1])
return 0;
}
return 1;
}

如果 s[1] == s[9] 为真,则 s[9] == s[1] 也为真。无需检查两次。

关于代码在 macOS 上逻辑上有效,但在 Ubuntu 16.04.5 上无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54454512/

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