问题:当我尝试编译我的文件并运行时,它存在分段问题。当我将文件传递给我的朋友时(他使用相同版本的ubuntu),服务器将能够运行。我想知道为什么?
下面是我整个页面的代码。 就个人而言,我觉得它没有任何问题,但我会将其粘贴以供参考,以防有人要求。
void readNStoreData ()
{
char words[MAX];
char *wholeLine;
char* delimiter = ",";
int cflag = 0;
int x, count = 0;
char input;
FILE *countryFile;
countryFile = fopen("Countries.txt","r");
if (!countryFile) {
exit(EXIT_FAILURE);
}
while (fgets (words, MAX - 1, countryFile) != NULL)
{
//atof to convert string to double
//split a single line into individual tokens indicating , as the delimeter
//afterwards store them into array
wholeLine = strtok (words, delimiter);
strcpy (records [count].TDL, wholeLine);
wholeLine = strtok (NULL, ",");
strcpy (records [count].cName, wholeLine);
wholeLine = strtok (NULL, delimiter);
strcpy (records [count].FIPS104, wholeLine);
wholeLine = strtok (NULL, delimiter);
strcpy (records [count].ISO2, wholeLine);
wholeLine = strtok (NULL, delimiter);
strcpy (records [count].ISO3, wholeLine);
wholeLine = strtok (NULL, delimiter);
records [count].ISO = atof(wholeLine);
wholeLine = strtok (NULL, delimiter);
strcpy (records [count].cCapital, wholeLine);
wholeLine = strtok (NULL, delimiter);
strcpy (records [count].cRegion, wholeLine);
wholeLine = strtok (NULL, delimiter);
strcpy (records [count].cCurrencyName, wholeLine);
wholeLine = strtok (NULL, delimiter);
strcpy (records [count].cCurrencyCode, wholeLine);
wholeLine = strtok (NULL, delimiter);
records [count].cPopulation = atof(wholeLine);
count++;
}
fclose(countryFile); //close file
}
我希望有人能够在某个地方发现错误。 感谢前进给那些帮助过的人!
运行gdb,错误实际上是这一行。 它位于这个功能中。
l(gdb) frame 1
l#1 0x08048936 in readNStoreData () at testserver.c:61
61 strcpy (records [count].cName, wholeLine);
答案 0 :(得分:2)
我强烈建议您要学会使用debugger,例如GDB。您可以通过sudo apt-get install gdb
这是一个简短的tutorial。
修改强>:
由于您现在正在运行GDB,请尝试在run
之前设置breakpoint:
(gdb) br testserver.c:61
在您执行run
之后,您应该能够print
各种变量并查看哪些变量是非法的。
答案 1 :(得分:0)
您对strcpy
的来电失败。您将错误的参数传递给它(有关文档,请参阅http://www.opengroup.org/sud/sud1/xsh/strcpy.htm。)
如果您希望我们分析此内容,您需要向我们展示
records
,records
数组,以及有多少元素,count
不超出records
数组records[count].cName
(可能是char*
或char[]
)足够大,以包含strtok
解析的令牌
注意 最大可能的令牌是
MAX
个字符,因为它可能是fgets
+ 1个尾随NUL字符iff返回的MAX行长度输入中没有单个delimiter
字符。
我有一种潜在的怀疑,你可能忘记了完全初始化接收阵列(records
),但是,除非你显示更多代码,否则我们无法知道。