c - 逐字读取文件
问题描述
我不知道为什么,但我的代码打印了一个 (null)(null)(null).... 我必须从文件 'words.txt' 打印单词列表。另一个问题是: fscanf 忽略空格?
#define WORD_LENGTH 1024
#define SIZE_QUOTE 100
int main(){
char **quote = malloc(sizeof(char*) * (size_t)SIZE_QUOTE);
long i;
for(i = 0; i < SIZE_QUOTE; i++){
if(!(malloc(sizeof(char) * (size_t)WORD_LENGTH)))
exit(1);
}
i = 0;
FILE *pf = fopen("words.txt", "r");
while(!feof(pf) && i < SIZE_QUOTE){
fscanf(pf, "%s", quote[i]);
printf("%s", quote[i]);
i++;
}
fclose(pf);
free(quote);
}
解决方案
您永远不会分配 to 的返回值,malloc()
因此quote[i]
他们最终会留下来NULL
(如果幸运的话):
char **quote = malloc(sizeof(char*) * (size_t)SIZE_QUOTE);
long i;
for(i = 0; i < SIZE_QUOTE; i++){
if(!(malloc(sizeof(char) * WORD_LENGTH)))
它应该是这样的:
char **quote = malloc(sizeof(char*) * (size_t)SIZE_QUOTE);
for(int i = 0; i < SIZE_QUOTE; i++){
quote[i] = malloc(sizeof(char) * WORD_LENGTH);
if(!quote[i])
malloc()
如果所有大小都已知,您也可以完全避免静态初始化该数组:
char quote[SIZE_QUOTE][WORD_LENGTH] = {{'\0'}};
此外,您最后也应该-free()
个人quote[i]
:
for(int i = 0; i < SIZE_QUOTE; ++i) free(quote[i]);
free(quote);
其他错误已经通过评论指出,不再赘述。
推荐阅读
- android - Android TabLayout 阻止激活与选定选项相邻的选项卡
- laravel - 在另一个方法中调用一个方法并在控制器中传递一个参数
- java - 不支持因 sonar.binaries 和 sonar.libraries 而失败的声纳扫描仪
- python - 是否可以验证发布的链接的 SSL 或 TLS 证书?
- php - php 我想在提交时处理两个函数
- android - Android,颤动错误:任务':app:mergeDebugResources'的执行失败
- jmeter - Jmeter如何读取csv文件中的文件路径
- python - 如何在另一个类的函数中从一个类调用对象
- ruby-on-rails - 如何更改活动管理员输入按钮文本
- pixi.js - PixiJS:具有两种不同的抗锯齿渲染器