转换时出现未知错误 [C]
Unknown Error with Conversion [C]
由于某种原因,在构建我的程序时,它说我有这个错误:
error: invalid conversion from 'char' to 'const char*' [-fpermissive]
strcpy(phrase[counter].word, ch);
我不太确定编译器的含义,我尝试将 char ch
更改为 const char ch
,但这似乎无法解决问题。如果有人能阐明这个问题,那就太好了。
代码如下:
const char* clean_word(void);
void create_word(struct Word_setup phrase[], FILE *fp)
{
char ch;
fscanf(fp, "%s", &ch);
strcpy(phrase[counter].word, ch);
strcpy(phrase[counter].word, clean_word());
}
const char* clean_word()
{
int i;
const char *ch = phrase[counter].word;
ch = phrase[counter].word;
for (i = 0; i < M; i++)
{
if (phrase[counter].word[i] == 39 || isalpha(phrase[counter].word[i])) //39 is the ASCII value for: '
i = i; //Just to be there, no reason to it. I just want the program to do nothing if its a letter or '
else
phrase[counter].word[i] = '[=11=]';
}
return ch;
}
此外,如果您想知道这是做什么用的,我正在构建一个程序,它将扫描 *.txt
文件,然后打印出出现次数最多的单词,以及出场次数。
如果你已经读过我的旧post,我决定尝试写它而不是每次数组被填充时重新分配space ,我只是将其设置为最多 200 个不同类型的单词。我将在完成后更改程序,以便每次数组填满时重新分配 space。
也许...
void create_word(struct Word_setup phrase[], FILE *fp)
{
fscanf(fp, "%s", phrase[counter].word);
clean_word();
}
问题出在这里:
char ch;
fscanf(fp, "%s", &ch);
strcpy(phrase[counter].word, ch);
strcpy()
函数期望它的第二个参数是指向源字符串头部的 指针 ,但是 ch
是 char
,而不是 char *
或 const char *
。正如 Keith Thompson 解释的那样,这是一个错误,因为整数不能隐式转换为 C 中的指针(除了值为 0 的常量表达式)。即使编译器执行了隐式转换,行为也肯定不是您想要的。
此外,fscanf()
也不会执行您想要的操作,因为即使参数 &ch
是正确的 type它附带的格式字符串,它是一个仅指向单个存储字符的指针,如果成功扫描字符串,fscanf 将 always 写入其边界之外(因为它必须写入一个字符串终止符即使是一个字符的字符串)。
@BLUEPIXY 的方法要好得多,假设 phrase[counter].word
是一个 char
数组,但即使在那里你也有越界的风险。为了保护自己免受这种情况的影响,请指定一个字段宽度。例如,如果 phrase[counter].word
是一个包含 20 char
的数组,那么使用这个 ...
fscanf(fp, "%19s", phrase[counter].word);
... 以确保 scanf()
不会将超过 20 个字符(包括字符串终止符)写入数组。
由于某种原因,在构建我的程序时,它说我有这个错误:
error: invalid conversion from 'char' to 'const char*' [-fpermissive]
strcpy(phrase[counter].word, ch);
我不太确定编译器的含义,我尝试将 char ch
更改为 const char ch
,但这似乎无法解决问题。如果有人能阐明这个问题,那就太好了。
代码如下:
const char* clean_word(void);
void create_word(struct Word_setup phrase[], FILE *fp)
{
char ch;
fscanf(fp, "%s", &ch);
strcpy(phrase[counter].word, ch);
strcpy(phrase[counter].word, clean_word());
}
const char* clean_word()
{
int i;
const char *ch = phrase[counter].word;
ch = phrase[counter].word;
for (i = 0; i < M; i++)
{
if (phrase[counter].word[i] == 39 || isalpha(phrase[counter].word[i])) //39 is the ASCII value for: '
i = i; //Just to be there, no reason to it. I just want the program to do nothing if its a letter or '
else
phrase[counter].word[i] = '[=11=]';
}
return ch;
}
此外,如果您想知道这是做什么用的,我正在构建一个程序,它将扫描 *.txt
文件,然后打印出出现次数最多的单词,以及出场次数。
如果你已经读过我的旧post,我决定尝试写它而不是每次数组被填充时重新分配space ,我只是将其设置为最多 200 个不同类型的单词。我将在完成后更改程序,以便每次数组填满时重新分配 space。
也许...
void create_word(struct Word_setup phrase[], FILE *fp)
{
fscanf(fp, "%s", phrase[counter].word);
clean_word();
}
问题出在这里:
char ch;
fscanf(fp, "%s", &ch);
strcpy(phrase[counter].word, ch);
strcpy()
函数期望它的第二个参数是指向源字符串头部的 指针 ,但是 ch
是 char
,而不是 char *
或 const char *
。正如 Keith Thompson 解释的那样,这是一个错误,因为整数不能隐式转换为 C 中的指针(除了值为 0 的常量表达式)。即使编译器执行了隐式转换,行为也肯定不是您想要的。
此外,fscanf()
也不会执行您想要的操作,因为即使参数 &ch
是正确的 type它附带的格式字符串,它是一个仅指向单个存储字符的指针,如果成功扫描字符串,fscanf 将 always 写入其边界之外(因为它必须写入一个字符串终止符即使是一个字符的字符串)。
@BLUEPIXY 的方法要好得多,假设 phrase[counter].word
是一个 char
数组,但即使在那里你也有越界的风险。为了保护自己免受这种情况的影响,请指定一个字段宽度。例如,如果 phrase[counter].word
是一个包含 20 char
的数组,那么使用这个 ...
fscanf(fp, "%19s", phrase[counter].word);
... 以确保 scanf()
不会将超过 20 个字符(包括字符串终止符)写入数组。