如何实现布尔函数istoken判断单词是否为Mad-Lib中的token?
你的Mad-Lib Token判断与文件处理方案
嘿,针对你的问题,我来一步步帮你解决:
一、编写istoken布尔函数
你的需求是判断一个单词是不是<adjective>这种格式的token,核心就是检查单词的首尾字符是否符合要求。这里要注意边界情况,比如空字符串或者长度不足2的单词(比如<>)不能算有效token。
结合你给出的代码框架,完善后的istoken函数如下:
#include <stdbool.h> #include <string.h> // 必须引入,因为要用到strlen bool istoken(char word[]) { // 先排除空指针或长度不够的情况 if (word == NULL || strlen(word) < 2) { return false; } // 检查首字符是<,尾字符是> return (word[0] == '<' && word[strlen(word) - 1] == '>'); }
二、关于fscanf的使用:完全可以,而且是更合适的选择!
你原来的process_file是按行读取内容,这种方式没法把句子拆成单个单词来识别token。用fscanf可以按空白符分隔逐个读取单词,这样就能对每个单词做判断:如果是token,就提示用户输入替换词;如果不是,直接写入输出文件。
修改后的process_file函数(适配你的代码):
#include <stdio.h> #include <string.h> #define MAX_WORD_LEN 255 // 和你open_file里的filename长度保持一致就行 void process_file(FILE* in, FILE* out) { char word[MAX_WORD_LEN]; // 用fscanf循环读取每个单词,直到文件末尾 while (fscanf(in, "%s", word) != EOF) { if (istoken(word)) { // 从token里提取提示文本,比如把<adjective>变成adjective char prompt[MAX_WORD_LEN]; // 跳过第一个<,复制到倒数第二个字符(跳过>) strncpy(prompt, word + 1, strlen(word) - 2); prompt[strlen(word) - 2] = '\0'; // 手动添加字符串结束符 // 提示用户输入对应的单词 char replacement[MAX_WORD_LEN]; printf("Enter a %s: ", prompt); scanf("%s", replacement); // 把替换后的单词写入输出文件,加个空格保持格式 fprintf(out, "%s ", replacement); } else { // 不是token,直接写入原单词 fprintf(out, "%s ", word); } } }
三、代码整合注意事项
- 记得在你的代码开头添加缺失的头文件:
#include <stdbool.h> #include <string.h> #define MAX_WORD_LEN 255 // 替换原来的MAX_LEN,或者保留MAX_LEN用于其他场景 - 原来的
process_file里的MAX_LEN如果不再使用,可以删除,或者调整为MAX_WORD_LEN。 - 测试的时候,输入文件里的token要保证是用空白分隔的(比如你的示例句子
My sister is a very <adjective> person.里的<adjective>前后有空格),这样fscanf才能正确识别为单个单词。
这样修改后,你的程序就能正常工作:读取输入文件,识别token,让用户输入替换词,最后生成完整的Mad-Lib故事到输出文件里啦!
内容的提问来源于stack exchange,提问作者Stacy Willis
相关产品推荐
相关产品推荐

