C代码的C ++错误

时间:2015-07-23 11:37:54

标签: c compiler-errors

第二次编辑

感谢各位帮忙!我用简单的c来纠正一切,因为这是我的作业必须写的。显然,我对C的了解很糟糕。我在写这篇文章的时候就是教我自己,但是使用我所有的c ++知识来做这件事。因此我混淆了语言文字。我仍然遇到了firstCheck()函数的问题。我将在下面用我当前的代码直接解释。

firstCheck()函数不能正常工作。在readFile()函数中,我已经成功地将给定文件中的文本逐行拆分为数组。 然后firstCheck()应该获取该数组“myString”并读取第一个字符串,直到出现“”(基本上是第一个单词/字符/等),以便我可以对其进行评估。

更新了Assem.c

#include "assem.h"

int readFile(FILE *file, struct assem *item) 
{
size_t i =0;
item->counter = 0;                                                                      //this is sort of the constructor, if you will. 
size_t maxLines = sizeof item->myLines / sizeof *item->myLines;
                                                                                        //breaks down text file into line by line 
while(i < maxLines && fgets(item->myString, sizeof item->myString, file))               //and stores them into "myLines array"
    {
        item->myLines[i] = strdup(item->myString);
        i++;
        item->counter++;
    }   

return 0;
}

void printFile(struct assem item)                                               //just printing things..prints it with a new line in front
{
            printf("\n");
    for(int s = 0; s < item.counter; s++)
        {
            printf("%s\n", item.myLines[s]);
        }
            printf("\n");
}

int firstCheck(struct assem item)               
{
    char *myWord [7] = {NULL};

    for(int s = 0; s < item.counter; s++)   
        {
        while(strcmp( fgets( item.myString, sizeof item.myString, stdin ), " " ) != 0 )         
            {
                myWord[s] = strdup(item.myLines[s]);
            }           
        }

        for(int s = 0; s < item.counter; s++)
        {
            printf("%s\n", myWord[s]);
        }

return 0;       
}

更新了“assem.h”

#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

struct assem
        {
                char myString[101];                     //buffer
                char *myLines[20];                      //this will store the lines from a text file..up to 20 lines
                int counter;                            //counter for number of lines
                                                        //printing stuff...prints file directly from whats STORED IN THE ARRAY

        };

        int readFile(FILE *FileToBeRead, struct assem *item);       //takes in the file that needs to be read and splits it into lines
        int firstCheck(struct assem item);
        void printFile(struct assem item);

更新了“main.c”

#include "Assem.c"

    int main()
    {
        struct assem test;
        FILE *mips;
        mips = fopen("/home/rpf0024/cse2610/Program1/mips.asm", "r");
        readFile(mips, &test);
        printFile(test);
        firstCheck(test);
        fclose(mips);
        return 0;
    }

1st EDIT OLD : 我目前正在编写一些错误的代码,但我不知道如何修复它们。对这些有什么解释? 错误发生在我的firstCheck()函数中,该函数尝试读取字符串直到* myLines []数组中的第一个字符。基本上,我试图读取第一个单词,直到空格出现,将其存储在另一个数组中,以便我可以对其进行评估。

以下是以下错误: 错误与我的.c文件底部的firstCheck()函数有关。我有行号注释。

  

Assem.c:35:31:错误:ISO C ++禁止指针和指针之间的比较   整数[-fpermissive] Assem.c:37:31:错误:无法转换'char **'   参数'1'到'char * strdup(const char *)

的'const char *'

.c文件

#include "assem.h"

int assem::readFile(FILE *file) 
{
int i =0;
counter = 0;                                            //this is sort of the constructor, if you will. 
                                                        //breaks down text file into line by line 
while(fgets(myString, 101, file) != NULL)               //and stores them into "myLines array"
    {
        myLines[i] = strdup(myString);
        i++;
        counter++;
    }   

return 0;
}

void assem::printFile()                 //just printing things..prints it with a new line in front
{
            printf("\n");
    for(int s = 0; s < counter; s++)
        {
            printf("%s\n", *(myLines+s));
        }
            printf("\n");
}

int assem::firstCheck()                 
{
    char *myWord [7];

    for(int s = 0; s < counter; s++)        //33
        {
        while(gets(*(myLines+s)) != ' ')    //35            
            {
                myWord[s] = strdup(myLines); //37
            }           
        }
return 0;       
}

.h文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

class assem
{

    public:
        char myString[101];                     //buffer
        char *myLines[20];                      //this will store the lines from a text file..up to 20 lines
        int counter;                            //counter for number of lines
        int readFile(FILE *FileToBeRead);       //takes in the file that needs to be read and splits it into lines
        int firstCheck();
        void printFile();                       //printing stuff...prints file directly from whats STORED IN THE ARRAY

};

2 个答案:

答案 0 :(得分:1)

忽略gets()邪恶,以下行

getSupportActionBar().show();

是错误的并且是第一次错误的原因。 while(gets(*(myLines+s)) != ' ') 返回gets(),您将其与空间进行比较,char *。这是错的。

建议:使用char。你可以使用像

这样的东西
fgets()

检查fgets()的返回值是否为NULL,即失败指示符。

另一个错误,我认为是因为试图混淆while (fgets(string, SIZE, stdin)) C。用标准C++语法重写相同的代码,使用C编译器编译器,你就可以了。

答案 1 :(得分:0)

首先,您需要决定是否要编写C C ++。 C不支持类,不应在C ++代码中使用C风格的字符串,I / O和内存管理例程。混合两种语言的元素是胃灼热的一种方法。

C和C ++是完全不同的语言,碰巧共享大量的语法和语义,而编写良好的C程序看起来或行为与编写良好的C ++程序不同。

现在强制性的咆哮已经不在了,你的两个主要类型错误如下:

while(gets(*(myLines+s)) != ' ') 

gets(您应该 从不 从不 从不< / em> 在C或C ++中使用 因任何原因 )返回类型为char *的值,但字符文字为{{1} }具有类型' '(在C ++中;在C中,它具有类型char)。 intchar不同,不兼容类型,您无法在它们之间进行比较。

您的其他类型错误是

char *

myWord[s] = strdup(myLines); myLines数组,在此背景下&#34;衰变&#34;输入char *char **期望类型strdup的参数,因此错误。您需要将数组的特定元素传递给char *

strdup

此外,您无法使用myWord[s] = strdup( myLines[s] ); ==运算符比较C风格的字符串;您必须使用像!=这样的库函数,例如

strcmp

请注意,我们正在与字符串文字while ( strcmp( buffer, " " ) != 0 ) ... 进行比较,而不是字符文字" "

如果您要编写 C代码,则需要将' 'assem更改为class,并将功能延期移至struct定义,并将结构类型作为参数传递给函数:

struct

然后,您需要从函数定义中删除/** * .h file */ #include <stdio.h> #include <stdlib.h> #include <string.h> struct assem { char myString[101]; char *myLines[20]; int counter; }; int readFile(FILE *FileToBeRead, struct assem *item ); int firstCheck( struct assem item ); void printFile( struct assem item); 前缀并使用assem::参数:

struct assem

然后将所有内容保存为 .c 文件,并使用 C编译器(例如int readFile(FILE *file, struct assem *item) { size_t i = 0; item->counter = 0; /** * get the number of array elements in item->myLines */ size_t maxLines = sizeof item->myLines / sizeof *item->myLines; while( i < maxLines && fgets( item->myString, sizeof item->myString, file ) ) { item->myLines[i] = strdup(item->myString); i++; item->counter++; } return 0; } void printFile( struct assem item ) { printf("\n"); for(int s = 0; s < item.counter; s++) { printf("%s\n", item.myLines[s])); // use subscript notation; it's // easier on the eyes } printf("\n"); } int firstCheck( struct assem item ) { char *myWord [7] = {NULL}; for(int s = 0; s < item.counter; s++) { /** * In your original code, you were overwriting the myLines array, * which contained what you read from the input file; I'm not sure * you want to do that here, so I'm using myString instead. */ while( strcmp( fgets( item.myString, sizeof item.myString, stdin ), " " ) != 0 ) { myWord[s] = strdup(item.myString); } } /** * At this point, you've dynamically allocated memory for the elements * of the myWords array, but you aren't using the array outside of this * function and you aren't freeing that memory when you're done, meaning * you have a memory leak. * * If they myWords array doesn't need to exist outside of this function, * then you need to free each element before exiting. */ return 0; } )进行编译。

如果您要编写 C ++代码,那么您应该使用gccfstreamstring类型而不是vector和数组类型,你应该利用像FILE函数模板和流迭代器这样的C ++特性:

std::copy

然后将其保存为 .cpp 文件,并使用 C ++编译器进行编译,例如#include <string> #include <vector> #include <fstream> #include <iterator> #include <algorithm> class assem { public: // don't need the temporary myString buffer std::vector< std::string > myLines; // since vectors know how big they are, you don't need a separate // counter attribute. int readFile( std::istream& fileToBeRead ); int firstCheck( ); int printFile( ); }; int assem::readFile( std::istream& fileToBeRead ) { /** * Use the copy function template with a stream iterator to * read the input file into your myLines vector */ std::copy( std::istream_iterator<std::string>( fileToBeRead ), // start std::istream_iterator<std::string>( ), // end back_inserter( myLines ) // destination ); return 0; } void assem::printFile( ) { /** * Use the same copy method to write each string in the myLines vector * to standard output (again using a stream iterator), separated by * newlines. */ std::cout << std::endl; // write the leading newline std::copy( myLines.begin(), // start myLines.end(), // end std::ostream_iterator< std::string >( std::cout, "\n" ) // destination ); } int assem::checkFirst( ) { std::vector< std::string > myWords; for ( std::vector::size_type s = 0; s < myLines.size(); s++ ) std::cin >> myWords; return 0; } int main( void ) { std::ifstream fileToBeRead( "myfile.txt" ); // or whatever its name is if ( fileToBeRead ) { assem myAssem; myAssem.readFile( fileToBeRead ); fileToBeRead.close(); ... } ... } 。请注意,使用C ++代码,您不需要使用g++进行清理或担心固定的数组大小,从而使代码更清晰。

某些程序逻辑存在其他问题(strdupreadFile的返回值将被用于,checkFirst为此目的的正确值),但至少应该让你走上正确的轨道。

希望。

编辑

我意识到C ++ 0例程中的逻辑不是原始代码的正确翻译。我知道我说你不应该在C ++代码中混合使用C风格的字符串和I / O,但有时候你没有选择权。这里应该是类似的东西:

checkFirst