c - 如何将单词对从文件存储到字符串?
问题描述
我必须从输入文件中读取并将单词对存储在动态分配的字符串中。我们必须创建一个 typedef 结构并分别存储第一个和第二个单词
该文件如下所示:
car couch \n
golf ball\n
mechanic repair\n
这些对由一个空格分隔,但在单词对之前和之后可以有尽可能多的 hitespaces。
最后我应该有 2 个字符串“汽车高尔夫球技工”和“沙发球修理”
typedef struct _VocabularyCouple_
{
char* first_word;
char* second_word;
} VocabCouple;
int main(int argc, char* argv[])
{
FILE *fp;
char* filename;
filename = argv[1];
fp = fopen(filename,"r");
VocabCouple voc_pair[10];
int count = 0;
char first_word[10];
char second_word[10]; //the strings have to start with size of 10
// and then if neede be enlarged by 10
while(!feof(fp))
{
fscanf(fp," %s %s", 1_word, 2_word); // to skip whitespaces ?
// I don't know how to enlarge if the word is bigger than 10
voc_pair[count].first_word = 1_word; //?? don't know if right method
}
}
正如你所看到的,我完全不知道如何实现这样的事情。任何帮助表示赞赏
解决方案
我不建议使用while(!feof(fp))
.
如果文件的长度是可变的,我会计算所有换行符(fgetc
无论你喜欢还是喜欢),然后回到开头。然后,一旦有了行数,就可以遍历它,然后使用它fscanf
来获取单词对。
我相信 1_word 是一个占位符,但这是 C 中的无效标识符,也不是您之前声明的标识符(first_word
)。
并且voc_pair[count].first_word = 1_word;
是正确的方法,你只需要记住count
在插入第一个单词和第二个单词后递增。
我还建议删除该filename
变量或将其声明移动到宏中,例如#define FILENAME argv[1]
,或者只定义一个具有文件名参数索引的常量。
您也不应该_
在 a 的开头使用struct
,或者在 C 中与此相关的任何内容,因为它是保留的,通常用于操作系统代码或其他您不想弄乱的东西。
关于如果单词大于 10 个字符则扩大字符串,您可以使用 realloc 并char*
为单词动态分配 a,并插入您自己的零终止符。您可以剪切空白字符并插入您自己的分隔符,然后将每个字符串读入一个数组。
要跳过额外的空格,我将创建一个单独的函数,它fgetc
与字符变量和位置变量一起使用,在每个新字符上增加位置变量。然后,您可以使用isspace
它来检查它是否是空格,然后丢弃该字符。
希望这有帮助!
推荐阅读
- mapping - NCL 绘制没有环绕框的地图
- python - 使用python elementree xml解析器和循环的宁静分页
- javascript - 每次生产 Kafka 消息时都需要连接吗?
- blazor-server-side - 如何从“无法重新连接到服务器。重新加载页面以恢复功能”中使用 Blazor Web 应用程序以编程方式恢复或重新启动。
- asp.net - Net core 3.1 Google authentication GetExternalLoginInfoAsync 由于某些浏览器中的空cookie而返回null
- c++ - 这个函数中 std::bad_alloc 的原因是什么?
- r - 当闪亮的应用程序通过单击按钮运行时如何运行 R 脚本?
- android - 如何从 Firebase 实时数据库中读取数据?
- django - modelformset 重复我的字段并从我的数据库中获取值
- android-studio - Kotlin 文档:链接到具有不同签名的方法?