- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想阅读短语,直到输入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 个动态分配的字符串数组 phrases
和 aux
,此时只需使用:
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/
当在一个类中处理它自己的字段和属性时,我通常只在它执行某些功能时才使用该属性(比如限制一个值或验证或其他)。否则我更喜欢直接读/写支持字段。 我以某种方式想到这将是一种更普遍的执行方式,但我突然想到我
我希望在形状的文本中执行文本替换。我使用的代码类似于下面的代码片段: # define key/value SRKeys, SRVals = ['x','y','z'], [1,2,3] # defi
我想阅读短语,直到输入Ctrl + Z,然后显示它们。我写了一段代码,但在我输入一个短语后,它显示该短语并退出。另外,我想动态分配内存。 #include #include #include i
我正在处理一些遗留代码,这些代码使用 win32 WriteFile() 写入二进制文件中的随机位置。写入的偏移量可以超过文件末尾,在这种情况下 WriteFile() 似乎会自动将文件大小扩展到偏移
背景:我正在使用 Microsoft.Office.Interop.Excel 库在我的 Windows 窗体程序中打开、操作和保存 excel 文件。由于我不会完全深入的原因,我需要在任何时候显示在
在我的程序的一部分中,我想更新 unordered_map 的给定值。问题可以这样简化: #include #include #include #include int main(int ar
我写了一个程序,可以从本地磁盘打开一个 xls,刷新其中的数据,然后再次保存。这很好用。 当我将文件名替换为指向 SharePoint 站点时出现问题。它可以很好地打开文件。刷新文件,但当它尝试保存文
我是一名优秀的程序员,十分优秀!