亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
請(qǐng)教:這個(gè)代碼的segmentation fault 在哪里
[打印本頁(yè)]
作者:
mcmay
時(shí)間:
2013-11-09 20:45
標(biāo)題:
請(qǐng)教:這個(gè)代碼的segmentation fault 在哪里
我做了一個(gè)代碼,預(yù)期功能是從兩個(gè)文件list1.txt和list2.txt中讀取中文名單,然后從list2中找出list1里不存在的名字。每個(gè)名字占一行,由于是從excel拷貝過來到text中的,所以名字后面有個(gè)TAB。但這個(gè)代碼運(yùn)行后總是出現(xiàn)segmentation fault的提示。請(qǐng)問哪里出現(xiàn)了問題,謝謝!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define SIZE 60
#define MAX 20
int main(void)
{
char names_1[SIZE][MAX];
char names_2[SIZE][MAX];
char * pnames_1[SIZE], * pnames_2[SIZE];
char nms_1[SIZE][MAX];
char nms_2[SIZE][MAX];
char * pnms_1[SIZE], * pnms_2[SIZE];
char * fnd[SIZE];
int cnt_1 = 0, cnt_2 = 0, cnt_fnd = 0;
int i,j;
FILE *fp1, *fp2, *fp3;
if((fp1 = fopen("list1.txt", "r")) == NULL)
{
fputs("Error reading \"listing1.txt\".", stderr);
exit(1);
}
if((fp2 = fopen("list2.txt", "r")) == NULL)
{
fputs("Error reading \"listing2.txt\".", stderr);
exit(1);
}
if((fp3 = fopen("results.txt", "w")) == NULL)
{
fputs("Error writing \"results.txt\".", stderr);
exit(1);
}
while(cnt_1 <= SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL)
{
pnames_1[cnt_1] = names_1[cnt_1];
pnms_1[cnt_1] = nms_1[cnt_1];
cnt_1++;
}
while(cnt_2 <= SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL)
{
pnames_2[cnt_2] = names_2[cnt_2];
pnms_2[cnt_2] = nms_2[cnt_2];
cnt_2++;
}
for(i = 0; i < cnt_1; i++)
{
while(*(pnames_1[i]) && !isspace(*pnames_1[i]))
{
*pnms_1[i] = *pnames_1[i];
pnames_1[i]++;
pnms_1[i]++;
}
* pnms_1[i] = '\0';
puts(pnms_1[i]);
}
for(i = 0; i < cnt_2; i++)
{
while(*(pnames_2[i]) && !isspace(*pnames_2[i]))
{
*pnms_2[i] = *pnames_2[i];
pnames_2[i]++;
pnms_2[i]++;
}
* pnms_2[i] = '\0';
puts(pnms_2[i]);
}
for(i = 0; i < cnt_1; i++)
for(j = 0; j < cnt_2; j++)
if(strcmp(pnms_2[j], pnms_1[i]) != 0)
{
fnd[i] = pnms_1[i];
cnt_fnd++;
}
if(cnt_fnd > 0)
{
for(i = 0; i < cnt_fnd; i++)
fputs(fnd[i], fp3);
fprintf(fp3, "\n%d found.", cnt_fnd);
}
else
fputs("\nNo results found.", fp3);
printf("\n%d\n", cnt_fnd);
puts("\nDone!");
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
復(fù)制代碼
作者:
mcmay
時(shí)間:
2013-11-09 22:19
我修正了一些錯(cuò)誤,但主要錯(cuò)誤依然存在:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define SIZE 60
#define MAX 20
int main(void)
{
char names_1[SIZE][MAX];
char names_2[SIZE][MAX];
char * pnames_1[SIZE], * pnames_2[SIZE];
char nms_1[SIZE][MAX];
char nms_2[SIZE][MAX];
char * pnms_1[SIZE], * pnms_2[SIZE];
char * fnd[SIZE];
int cnt_1 = 0, cnt_2 = 0, cnt_fnd = 0;
int i,j;
FILE *fp1, *fp2, *fp3;
if((fp1 = fopen("list1.txt", "r")) == NULL)
{
fputs("Error reading \"listing1.txt\".", stderr);
exit(1);
}
if((fp2 = fopen("list2.txt", "r")) == NULL)
{
fputs("Error reading \"listing2.txt\".", stderr);
exit(1);
}
if((fp3 = fopen("results.txt", "w")) == NULL)
{
fputs("Error writing \"results.txt\".", stderr);
exit(1);
}
while(cnt_1 <= SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL)
{
pnames_1[cnt_1] = names_1[cnt_1];
pnms_1[cnt_1] = nms_1[cnt_1];
cnt_1++;
}
while(cnt_2 <= SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL)
{
pnames_2[cnt_2] = names_2[cnt_2];
pnms_2[cnt_2] = nms_2[cnt_2];
cnt_2++;
}
for(i = 0; i < cnt_1; i++)
{
while(*(pnames_1[i]) && !isspace(*pnames_1[i]))
{
*pnms_1[i] = *pnames_1[i];
pnames_1[i]++;
pnms_1[i]++;
}
* pnms_1[i] = '\0';
}
for(i = 0; i < cnt_2; i++)
{
while(*(pnames_2[i]) && !isspace(*pnames_2[i]))
{
*pnms_2[i] = *pnames_2[i];
pnames_2[i]++;
pnms_2[i]++;
}
* pnms_2[i] = '\0';
}
for(i = 0; i < cnt_1; i++)
for(j = 0; j < cnt_2; j++)
if(strcmp(nms_1[i], nms_2[j]) == 0)
{
fnd[i] = nms_1[i];
cnt_fnd++;
}
if(cnt_fnd > 0)
{
for(i = 0; i < cnt_fnd; i++)
{
fputs(fnd[i], fp3);
putchar('\n');
}
fprintf(fp3, "\n%d found.", cnt_fnd);
}
else
fputs("\nNo results found.", fp3);
printf("\n%d\n", cnt_fnd);
puts("\nDone!");
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
復(fù)制代碼
作者:
huangyukun2012
時(shí)間:
2013-11-13 10:53
問一下樓主:在line41: pnms_1[cnt_1] = nms_1[cnt_1];這句之前,對(duì)nms_1[cnt_1]賦初值了嗎?
作者:
huangyukun2012
時(shí)間:
2013-11-13 10:54
問一下樓主:在line41: pnms_1[cnt_1] = nms_1[cnt_1];這句之前,對(duì)nms_1[cnt_1]賦初值了嗎?
作者:
天地散人
時(shí)間:
2013-11-13 19:05
似乎問題出在fputs上
作者:
Hadron74
時(shí)間:
2013-11-13 21:18
回復(fù)
2#
mcmay
我在MacOS上運(yùn)行了你的程序,自己建了小數(shù)據(jù)list1和list2,沒有你說的錯(cuò)誤,能執(zhí)行。
你需要把數(shù)據(jù)也貼上來,看看。也許是數(shù)組越界錯(cuò)誤,大數(shù)據(jù)才顯現(xiàn)出來。
作者:
Herowinter
時(shí)間:
2013-11-14 16:46
回復(fù)
6#
Hadron74
同意樓上的,我在linux也可以編譯運(yùn)行,
只是結(jié)果也不大對(duì),只找出了第一個(gè)在list2不在list1的名字,
我用的是樓主2樓改進(jìn)過的代碼。
作者:
shan_ghost
時(shí)間:
2013-11-14 17:15
既然是必現(xiàn),那還不簡(jiǎn)單……
windows,用你的vs單步執(zhí)行,甚至只是用ide執(zhí)行都行,它自己會(huì)告訴你到那行訪問違例的;達(dá)到及格線的ide都允許你查看當(dāng)時(shí)的調(diào)用棧以及變量值。
如果是linux,編譯時(shí)加-g參數(shù),然后ulimit -c unlimited允許吐core;等程序core掉,gdb 程序名 -c core.xxxx,然后bt看一下調(diào)用棧,或者用p看一下變量值。
有這些信息,結(jié)合程序邏輯稍微做一下推斷……就這幾行代碼,不是太奇葩的情況都是秒殺……
先學(xué)會(huì)用好你手頭的工具……尤其是在論壇提問時(shí)。這些工具的報(bào)告,或許你看起來是天書,但在別人眼里,很可能就是赤裸裸的答案……
作者:
__slucx__
時(shí)間:
2013-11-15 09:49
cnt_1 <= SIZE
pnames_1[cnt_1] = names_1[cnt_1];
等于可以嗎?
fgets(names_1[cnt_1], MAX, fp1)
MAX可以嗎?
作者:
不能超過15字
時(shí)間:
2013-11-15 11:35
調(diào)試core文件
歡迎光臨 Chinaunix (http://www.72891.cn/)
Powered by Discuz! X3.2