【发布时间】:2010-11-30 16:15:00
【问题描述】:
我遇到了一些字符串数组问题,这些问题似乎侵犯了保留的内存空间。代码太大,这里就不贴了,所以我把重要的部分贴在下面:
int main ( ){
int i = 0, j = 0, k = 0, count = 0, numLinhas = 0, l = 0;
char string[100][100];
char line [17];
char str[4];
char str1[5];
char str2[4];
char str3[4];
FILE *p;
p = fopen("text.txt", "r");
while(fgets(line, sizeof line, p)!=NULL){
printf("%s", line);
strncpy(string[i], line, 17);
i++;
numLinhas++;
}
fclose(p);
char *temp[numLinhas];
之后它进入一个循环,其中将文件中包含的语句的含义存储在string [i] 中。 for的开头和三个例子如下所示:
for (i = 0; i<numLinhas; i++){
sscanf( string[i], "%s %s %s %s" ,str1, str,str2, str3);
if(str[0]=='0' && str[1] == '0' && str[2]!= 'd') {
temp[i] = "NOP";
count++;
}
if(str[0]=='0'&& str[1] == '6' && str[2]!= 'd') {
sprintf(temp[i],"%s,%s" , "MVI B", str2);
count = count+2;
}
if(str[0]=='0'&& str[1] == '7' && str[2]!= 'd') {
temp[i] = "RLC";
count++;
}
错误是偶然的 - 它并不总是发生。它通常发生在调用 sprintf 时。 是啊!以下是我正在加载的 txt 文件作为示例:
0000 21a 11r 00r
0003 7Ea
0004 21a 12r 00r
0007 46a
0008 80a
0009 21a 13r 00r
000C 77a
000D 3Ea 01a
000F 3Da
0010 76a
0011 0Ad
0012 03d
0013 01d
刚看到一些新东西。这是我得到的编译窗口:
marcos@john:~/Desktop$ ./paraler
0000 21a 11r 00rValor de l: 16
Valor de l: 1
0003 7Ea
Valor de l: 9
0004 21a 12r 00rValor de l: 16
Valor de l: 1
0007 46a
Valor de l: 9
0008 80a
Valor de l: 9
0009 21a 13r 00rValor de l: 16
Valor de l: 1
000C 77a
Valor de l: 9
000D 3Ea 01a
Valor de l: 13
000F 3Da
Valor de l: 9
0010 76a
Valor de l: 9
0011 0Ad
Valor de l: 9
0012 03d
Valor de l: 9
0013 01d
Valor de l: 9
string:0000 21a 11r 00r
string:
string:0003 7Ea
string:0004 21a 12r 00r
string:
string:0007 46a
string:0008 80a
string:0009 21a 13r 00r
string:
string:000C 77a
string:000D 3Ea 01a
string:000F 3Da
string:0010 76a
string:0011 0Ad
string:0012 03d
string:0013 01d
Segmentation fault
奇怪的是,我得到了一些字符串数组的空格......它与错误有什么关系吗?
【问题讨论】:
-
你试过在调试器中运行你的代码吗?
-
第 1 步是将不安全的 sprintf 替换为安全的 snprintf。
-
请对您的代码格式进行一些处理。第二位的缩进看起来搞砸了。
-
注意 strncpy。在
strncpy(string[i], line, 17);中,如果一行是 17 个字符或更多字符,则不写入 nul 终止符,并且 string[i] 并不真正包含字符串。
标签: c string segmentation-fault