struct bucket
{
int nStrings; //No. of Strings in a Bucket.
char strings[MAXSTRINGS][MAXWORDLENGTH]; // A bucket row can contain maximum 9 strings of max string length 10.
};//buck[TOTBUCKETS];
void lexSorting(char array[][10], int lenArray, int symb) //symb - symbol, sorting based on character symbols.
{
int i, j;
int bucketNo;
int tBuckNStrings;
bucket buck[TOTBUCKETS];
for(i=0; i<lenArray; i++)
{
bucketNo = array[i][symb] - 'a'; // Find Bucket No. in which the string is to be placed.
tBuckNStrings = buck[bucketNo].nStrings; // temp variable for storing nStrings var in bucket structure.
strcpy(buck[bucketNo].strings[tBuckNStrings],array[i]); // Store the string in its bucket.
buck[bucketNo].nStrings = ++tBuckNStrings; //Increment the nStrings value of the bucket.
}
// lexSorting(array, lenArray, ++symb);
printf("****** %d ******\n", symb);
for(i=0; i<TOTBUCKETS; i++)
{
printf("%c = ", i+'a');
for(j=0; j<buck[i].nStrings; j++)
printf("%s ",buck[i].strings[j]);
printf("\n");
}
}
int main()
{
char array[][10] = {"able","aback","a","abet","acid","yawn","yard","yarn","year","yoke"};
int lenArray = 10;
int i;
printf("Strings: ");
for(i=0; i<lenArray; i++)
printf("%s ",array[i]);
printf("\n");
lexSorting(array, lenArray, 0);
}
这里是完整的代码,我正在尝试。因为我已经很长一段时间才触及C编程,所以我在结构声明中犯了错误。 问题出在这里: -
1)我已经在上面声明了一个结构,并将其对象声明为数组(buck [])。
2)现在,当我将这个对象数组与结构一起声明时,它工作正常..我现在已经评论过这个。
3)但是当我在函数内声明这个对象数组时...因为最终我必须声明内部函数(因为我需要构建一个递归程序,其中对象将在非常递归的调用中创建)然后程序抛出分段错误。
预期输出
> [others@centos htdocs]$ ./a.out
> Strings: able aback a abet acid yawn
> yard yarn year yoke
> ****** 0 ******
> a = able aback a abet acid
> b =
> c
> .
> .
> y = yawn yard yarnyear yoke
> z =
实际输出
[others@centos htdocs]$ ./a.out
Strings: able aback a abet acid yawn yard yarn year yoke
Segmentation fault
我不知道,我在这方面有什么不同。请帮助。
感谢。
答案 0 :(得分:4)
您的程序出了什么问题,它不包含main()
函数,因此它不会链接。
除此之外,在这里提问时你应该总是这样做:
事实上,当我添加这一行时:
int main (void) { return 0; }
它编译并链接正常。
这意味着它几乎肯定是您遇到的运行时错误,因此我们需要 main()
来弄清楚您做错了什么。
使用我的通灵调试技巧,在文件范围和块范围内声明它之间的一个重要区别是文件范围版本将初始化为零。
这意味着所有结构字段实际上都是零(对于计数)和空字符串(对于字符串)。使用块范围,这些计数和字符串将是未初始化的。
您使用TOBUCKETS
打印结构的事实可能意味着您正在尝试打印其中一个未初始化的字符串。
我认为可能发生的事情是nStrings
字段在开始处理时包含垃圾值。您应该手动将其初始化为零(使用循环)并查看是否可以解决您的问题。在buck
函数中声明sort
之后将其放入:
for (i = 0; i < TOTBUCKETS; i++)
buck[i].nStrings = 0;
右。事实证明是问题。当我修复最新代码中的错误时,我也会遇到分段违规,但是,当我在上面添加该部分时,它可以正常工作:
#include <stdio.h>
#include <string.h>
#define MAXSTRINGS 9
#define MAXWORDLENGTH 10
#define TOTBUCKETS 26
struct bucket
{
int nStrings;
char strings[MAXSTRINGS][MAXWORDLENGTH];
};
void lexSorting(char array[][10], int lenArray, int symb)
{
int i, j;
int bucketNo;
int tBuckNStrings;
struct bucket buck[TOTBUCKETS];
for(i=0; i<TOTBUCKETS; i++) buck[i].nStrings = 0;
for(i=0; i<lenArray; i++)
{
bucketNo = array[i][symb] - 'a';
tBuckNStrings = buck[bucketNo].nStrings;
strcpy(buck[bucketNo].strings[tBuckNStrings],array[i]);
buck[bucketNo].nStrings = ++tBuckNStrings;
}
printf("****** %d ******\n", symb);
for(i=0; i<TOTBUCKETS; i++)
{
printf("%c = ", i+'a');
for(j=0; j<buck[i].nStrings; j++)
printf("%s ",buck[i].strings[j]);
printf("\n");
}
}
int main()
{
char array[][10] = {"able","aback","a","abet","acid",
"yawn","yard","yarn","year","yoke"};
int lenArray = 10;
int i;
printf("Strings: ");
for(i=0; i<lenArray; i++)
printf("%s ",array[i]);
printf("\n");
lexSorting(array, lenArray, 0);
}
输出结果为:
Strings: able aback a abet acid yawn yard yarn year yoke
****** 0 ******
a = able aback a abet acid
b =
c =
d =
e =
f =
g =
h =
i =
j =
k =
l =
m =
n =
o =
p =
q =
r =
s =
t =
u =
v =
w =
x =
y = yawn yard yarn year yoke
z =
答案 1 :(得分:0)
关键字struct
。