第二次编辑:
感谢各位帮忙!我用简单的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
};
答案 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
)。 int
和char
不同,不兼容类型,您无法在它们之间进行比较。
您的其他类型错误是
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 ++代码,那么您应该使用gcc
,fstream
和string
类型而不是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++
进行清理或担心固定的数组大小,从而使代码更清晰。
某些程序逻辑存在其他问题(strdup
和readFile
的返回值将被用于,checkFirst
为此目的的正确值),但至少应该让你走上正确的轨道。
希望。
编辑
我意识到C ++ 0
例程中的逻辑不是原始代码的正确翻译。我知道我说你不应该在C ++代码中混合使用C风格的字符串和I / O,但有时候你没有选择权。这里应该是类似的东西:
checkFirst