转换时出现未知错误[C]

时间:2015-04-19 22:45:40

标签: c char

出于某种原因,在构建我的程序时,它说我有这个错误:

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] = '\0';
    }
    return ch;
}

如果您想知道这是为了什么,我正在构建一个程序,它将扫描*.txt文件,然后打印出具有最多出​​现次数的单词,以及数字外表。

如果你已经阅读了我的旧帖子,我决定尝试编写它而不必在每次填充数组时重新分配空间,我只是将其设置为200最大不同类型的单词。一旦完成,我将更改程序,以便每次阵列填满时重新分配空间。

2 个答案:

答案 0 :(得分:3)

问题在于:

    char ch;

    fscanf(fp, "%s", &ch);
    strcpy(phrase[counter].word, ch);

strcpy()函数期望其第二个参数是源字符串头部的指针,但chchar,而不是char * {1}}或const char *。正如Keith Thompson解释的那样,这是一个错误,因为整数不能隐式转换为C中的指针(除了值为0的常量表达式)。即使编译器无论如何都执行了隐式转换,行为肯定不是你想要的。

此外,fscanf()也不会做你想要的,因为即使参数&ch是格式字符串的正确类型它如果成功扫描字符串,fscanf将始终总是在其边界外写入(因为它必须写一个字符串终结符,即使对于一个字符也是如此)字符串)。

@ BLUEPIXY的方法要好得多,假设phrase[counter].word是一个char数组,但即使存在,也有可能超出其范围。为了保护自己,请指定字段宽度。例如,如果phrase[counter].word是20 char s的数组,则使用此...

    fscanf(fp, "%19s", phrase[counter].word);

...确保scanf()不会向数组写入超过20个字符(包括字符串终结符)。

答案 1 :(得分:2)

也许...

void create_word(struct Word_setup phrase[], FILE *fp)
{
    fscanf(fp, "%s", phrase[counter].word);
    clean_word();
}