我正在编写一个程序(用于课堂作业),将普通单词翻译成他们的盗版对象(hi = ahoy)。
我使用两个字符串数组创建了字典,现在我正在尝试翻译input.txt文件并将其放入output.txt文件中。我能够写入输出文件,但它只会在新行上反复写入翻译后的第一个单词。
我已经做了大量的阅读/搜索,据我所知,使用fscanf()
阅读我的输入文件并不理想,但我无法弄清楚什么会更好功能使用。我需要逐字逐句读取文件(用空格分隔),并在每个标点符号中读取。
输入文件:
Hi, excuse me sir, can you help
me find the nearest hotel? I
would like to take a nap and
use the restroom. Then I need
to find a nearby bank and make
a withdrawal.
Miss, how far is it to a local
restaurant or pub?
输出:ahoy(46次,每次在另一条线上)
翻译功能:
void Translate(char inputFile[], char outputFile[], char eng[][20], char pir[][20]){
char currentWord[40] = {[0 ... 39] = '\0'};
char word;
FILE *inFile;
FILE *outFile;
int i = 0;
bool match = false;
//open input file
inFile = fopen(inputFile, "r");
//open output file
outFile = fopen(outputFile, "w");
while(fscanf(inFile, "%s1023", currentWord) == 1){
if( ispunct(currentWord) == 0){
while( match != true){
if( strcasecmp(currentWord, eng[i]) == 0 || i<28){ //Finds word in English array
fprintf(outFile, pir[i]); //Puts pirate word corresponding to English word in output file
match = true;
}
else {i++;}
}
match = false;
i=0;
}
else{
fprintf(outFile, &word);//Attempt to handle punctuation which should carry over to output
}
}
}
答案 0 :(得分:0)
当你开始匹配不同的英语单词时,i<28
最初是正确的。因此,表达式<anything> || i<28
也会立即生效,相应地,代码的行为就像在字典中的第一个单词上找到匹配一样。
为避免这种情况,您应该处理&#34;在索引i
&#34;处找到匹配项。和#34;找不到匹配&#34;条件分开。这可以通过以下方式实现:
if (i >= dictionary_size) {
// No pirate equivalent, print English word
fprintf(outFile, "%s", currentWord);
break; // stop matching
}
else if (strcasecmp(currentWord, eng[i]) == 0){
...
}
else {i++;}
dictionary_size
在您的情况下为28(基于您使用i<28
停止条件的尝试)。
答案 1 :(得分:0)
这是我用来解析问题的代码片段。这就是它的作用:
鉴于此输入:
hi, excuse me sir, how are you.
它根据DELIMS常量将每个单词放入一个字符串数组中,并删除DELIMS const中的任何char。这会破坏你原来的输入字符串。我只是打印出字符串数组:
[hi][excuse][me][sir][how][are][you][(null)]
现在这是从stdin获取输入,但您可以更改它以从文件流中获取它。您也可能需要考虑输入限制等。
#include <stdio.h>
#include <string.h>
#define CHAR_LENGTH 100
const char *DELIMS = " ,.\n";
char *p;
int i;
int parse(char *inputLine, char *arguments[], const char *delimiters)
{
int count = 0;
for (p = strtok(inputLine, delimiters); p != NULL; p = strtok(NULL, delimiters))
{
arguments[count] = p;
count++;
}
return count;
}
int main()
{
char line[1024];
size_t bufferSize = 1024;
char *args[CHAR_LENGTH];
fgets(line, bufferSize, stdin);
int count = parse(line, args, DELIMS);
for (i = 0; i <= count; i++){
printf("[%s]", args[i]);
}
}