C 从文件转换文本
我正在做一个项目,我需要将文本从文件转换成莫尔斯。为此,我将字母表及其相应的摩尔斯电码(也在一个文件中)存储到一个结构中 文件“original.txt”类似于:C 从文件转换文本,c,function,C,Function,我正在做一个项目,我需要将文本从文件转换成莫尔斯。为此,我将字母表及其相应的摩尔斯电码(也在一个文件中)存储到一个结构中 文件“original.txt”类似于: My name is Olivia We are in 2019 3 plus 4 is 7 文件“morse.txt”是: 等等 现在我唯一的问题是: warning: comparison between pointer and integer > if (line[i] == l[j].letters){ (line
My name is Olivia
We are in 2019
3 plus 4 is 7
文件“morse.txt”是:
等等
现在我唯一的问题是:
warning: comparison between pointer and integer
> if (line[i] == l[j].letters){ (line 25)`
#包括
#包括
#包括
#包括
/*常数*/
#定义T_MORSE 8
#定义Q_字母26
#定义Q_数10
#定义Q_摩尔斯(Q_字母+Q_数字)
#定义最大字符串大小50
typedef结构{/*需要字符串结束符的位置\0*/
字符字母[5];/*存储字母,将其作为字符串获取,但仅使用第一个字母*/
char lettersMorse[T_MORSE];/*存储字母的相应莫尔斯符号*/
}字母表;
字母l[Q_MORSE];
无效进程(常量字符*行){
int j,i;
对于(i=0;行[i];++i){
对于(j=0;j<37;++j){//莫尔斯字母向量
if(第[i]==l[j]行,字母){
printf(“%s”,l[j]。lettersMorse);
printf(“”;}
}
}
}
int main(){
int cont=0,j;
文件*arch;
arch=fopen(“morse.txt”、“r”);
if(arch==NULL){
printf(“错误”);
返回0;
}
否则{
while(fscanf(拱形,“%s%s”,l[cont]。字母,l[cont]。字母数)!=EOF){
l[cont]。字母[1]='\0';/*消除不需要的字符*/
对于(j=0;j严格回答问题,不进行其他代码审查:
if(第[i]==l[j]行.字母)
这里的问题是line
是一个字符串,因此line[i]
是一个单个字符(在C中也是一个整数,因此是关于整数的警告文本)。但是letters
是一个字符串,它是一个字符数组,在这样的上下文中被视为指向字符的指针(因此是关于指针的警告文本)
阅读代码中的一条注释时,您希望第一个字符是字母
,因此:
if(第[i]==l[j]行,字母[0])
您的莫尔斯字母表定义文件包含哪些内容?阅读文件后,l
的内容是否正确?您提供了37个符号的空间。这足以容纳26个字母、10个数字和1个其他字符。如何处理大写/小写字母?顺便说一句:使用像37
这样的硬编码幻数是一个好方法在大多数情况下,这不是一个好主意。您应该定义一个宏,并在需要数字的每个地方使用它。您可能希望读取带有以下字母的文件:a.-B-…C-。-.D-…等(每个字母在另一个字母下面)在l[i]字母中,我存储了拉丁字母,在l[i]字母中,字母分别对应摩尔斯电码。两者都是在结构字母表中。这就是我想存储它们的原因。昨天我尝试时,它都没问题,但现在它只读取字母A…Ognum,为什么代码不检查fscanf(arch,…)的返回值
?为什么使用fscanf()
的循环允许超过37次迭代?我不知道…我之所以输入37次,是因为26个字母和10个数字。这是我的教授给我的文件,我无法修改。我需要做的是将字母存储到结构中,但我不知道为什么我的输入方式不起作用。。。
warning: comparison between pointer and integer
> if (line[i] == l[j].letters){ (line 25)`
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* Constants */
#define T_MORSE 8
#define Q_LETTERS 26
#define Q_NUMBERS 10
#define Q_MORSE (Q_LETTERS+Q_NUMBERS)
#define MAX_STRING_SIZE 50
typedef struct{ /* needs a position to the string finisher \0 */
char letters[5]; /* stores the letters , get it as a string , but use only the first letter */
char lettersMorse[T_MORSE];/* stores the respective morse symbols of the letters */
}alphabet;
alphabet l[Q_MORSE];
void process(const char *line) {
int j, i;
for (i = 0; line[i]; ++i) {
for ( j = 0; j < 37; ++j ){ //vector for morse letters
if (line[i] == l[j].letters){
printf("%s", l[j].lettersMorse);
printf(" ");}
}
}
}
int main(){
int cont=0,j;
FILE *arch;
arch = fopen("morse.txt","r");
if( arch == NULL ){
printf("ERROR");
return 0;
}
else{
while(fscanf(arch,"%s%s",l[cont].letters,l[cont].lettersMorse) != EOF){
l[cont].letters[1] = '\0'; /* eliminates unwanted characters */
for(j=0; j<strlen(l[cont].lettersMorse); j++){
if(l[cont].lettersMorse[j] == '*'){ /* if an asterisk is found */
l[cont].lettersMorse[j] = '\0'; /* eliminate asterisk */
break;
}
}
cont++; /*points to the next position of the vector */
}
}
fclose(arch);
FILE *fp;
char line[MAX_STRING_SIZE];
fp = fopen("original.txt", "r");
if (arch==NULL){
printf("ERROR");}
while (fgets(line,MAX_STRING_SIZE,fp) != NULL) {
process(line);
}
fclose(fp);
return 0;
}
'''