gpt4 book ai didi

C - 在读 CTRL+Z 之前如何阅读短语?

转载 作者:行者123 更新时间:2023-11-30 14:43:37 25 4
gpt4 key购买 nike

我想阅读短语,直到输入Ctrl + Z,然后显示它们。我写了一段代码,但在我输入一个短语后,它显示该短语并退出。另外,我想动态分配内存。

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

int main()
{
char words[100],
**phrases,
**aux;
int c = 0;
phrases = (char **)malloc(1 * sizeof(char *));
if (phrases == NULL) exit(1);

aux = (char **)malloc(1 * sizeof(char *));
if (aux == NULL) exit(1);

do {
printf("Enter phrase: ");
fgets(words, 100, stdin);
aux[c] = (char *)malloc(strlen(words) * sizeof(char));
if (aux[c] == NULL) exit(1);
phrases[c] = aux[c];
strcpy(phrases[c], words);
c++;
aux = (char **)realloc(phrases, (c + 1) * sizeof(char *));
if (aux == NULL) exit(1);
phrases = aux;
} while (strcmp(phrases, "^Z") == 0);

for (int i = 0; i < c; i++) {
fputs(phrases[i], stdout);
printf("\n");
}

for (int i = 0; i < c; i++) free (phrases[i]);
free (phrases);
return 0;
}

你能告诉我我做错了什么以及应该如何做吗?

最佳答案

尝试和错误很值得学习。但现在,事情要清理了。

第一do not cast malloc in C : 没有用,只能让讨厌的bug安静下来。

然后,您将使用 2 个动态分配的字符串数组 phrasesaux,此时只需使用:

phrases=aux;

这很糟糕,因为它会泄漏短语先前指向的内存:它仍然被分配,但您既不能访问它,也不能释放它,直到程序结束。

保持愚蠢简单是一个很好的规则。在这里您可以忘记aux而只使用短语

无论如何,你真正的问题是如何知道是否输入了 Ctrl Z? Windows 上的 Ctrl-Z 或类 Unix 上的 Ctrl-D 生成和文件结束 条件在终端上键入时 - 从文件或管道读取时它们无效...

fgets 在文件末尾(或错误)返回 NULL,因此您应该在循环中测试它。并且不要试图在这里找到一个聪明的 while ,因为读取必须在提示之后进行,并且测试必须在读取之后立即进行。因此,请坚持使用旧的 for (;;) { ...break; ...}

最后,fgets 读取到行尾并将其保留到缓冲区中。因此,在打印短语后无需再显示一个,除非您想弄清楚长度超过 99 个字符的行会发生什么

毕竟,您的代码可能会变成:

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

int main()
{
char words[100], **phrases /*, **aux */;
int c=0;
phrases=(char **)malloc(1*sizeof(char *));
if (phrases==NULL) exit(1);
/* aux=(char **)malloc(1*sizeof(char *));
if (aux==NULL) exit(1); */
for(;;) {
printf("Enter phrase: ");
if (NULL == fgets(words, 100, stdin)) break; // exit loop on end of file
phrases[c]=(char *)malloc(strlen(words)*sizeof(char)); // note sizeof(char) is 1 by definition
if (phrases[c]==NULL) exit(1);
strcpy(phrases[c], words);
c++;
phrases=(char **)realloc(phrases, (c+1)*sizeof(char *));
if (phrases==NULL) exit(1);
}
printf("\n"); // skip a line here to go pass the prompt
for (int i=0; i<c; i++) {
fputs(phrases[i], stdout);
//printf("\n"); // you can keep it to make long lines splitted
}
for (int i=0; i<c; i++) free (phrases[i]); // ok free the strings
free (phrases); // then the array
return 0;
}

小改进:sizeof(char) 可以省略,因为根据定义它是 1。但如果您发现它更清晰或更一致,则可以保留它。

关于C - 在读 CTRL+Z 之前如何阅读短语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53829521/

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