如何解决我在接受 C 中的 N 个字符串行时使用 fscanf 和 fgets 出现分段错误
我有一个包含变量 x、y 和 z 的多项式结构
struct Node
{
float coeff;
int powX;
int powY;
int powZ;
struct Node* next;
};
我想以 n
powX
powY
powZ
的形式读取多项式的 coeff
用户输入,我有一个 {{1} } 循环,但它给了我分段错误。可能是什么问题?
for
这是我的主要功能:
void readPolynomial(struct Node** poly)
{
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
*poly = temp;
int terms;
fscanf(stdin,"%d",&terms);
getchar();
char entry[200];
char * splitter;
for(int i = 0; i < terms; i++)
{
fgets(entry,200,stdin);
splitter = strtok(entry," ");
temp->powX = atoi(splitter);
splitter = strtok(NULL," ");
temp->powY = atoi(splitter);
splitter = strtok(NULL," ");
temp->powZ = atoi(splitter);
splitter = strtok(NULL," ");
temp->coeff = atof(splitter);
temp->next = NULL;
if(i != terms-1)
{
temp->next = (struct Node*)malloc(sizeof(struct Node));
temp = temp->next;
temp->next = NULL;
}
}
}
对于多项式 int main()
{
struct Node* first = NULL;
readPolynomial(&first);
return 0;
}
:4x⁵y⁴z²
样本输入:
5 4 2 4
全码功能:获取两个多项式的和,按规范顺序打印
3
5 4 2 4
1 6 0 -7
1 0 1 9
样本输入:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct Node
{
float coeff;
int powX;
int powY;
int powZ;
struct Node* next;
};
void readPolynomial(struct Node** poly)
{
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
*poly = temp;
int terms;
fscanf(stdin,&terms);
getchar();
char entry[200];
char *splitter;
for(int i = 0; i < terms; i++)
{
fgets(entry,stdin);
splitter = strtok(entry," ");
temp->coeff = atof(splitter);
temp->next = NULL;
if(i != terms-1)
{
temp->next = (struct Node*)malloc(sizeof(struct Node));
temp = temp->next;
temp->next = NULL;
}
}
}
int degree(struct Node *term) {
return (term->powX*pow(10,2)) + (term->powY*pow(10,1)) + (term->powZ*pow(10,0));
}
int termCount(struct Node* poly)
{
int count = 0;
while(poly != NULL)
{
count++;
poly = poly->next;
}
return count;
}
void displayPolynomial(struct Node* poly)
{
int c = termCount(poly);
struct Node *temp1,*t,*temp2;
int tempX,tempY,tempZ,tempCoeff;
for(int i = c-2; i>= 0; i--)
{
temp1 = poly;
temp2 = temp1->next;
for(int j = 0; j <= i; j++)
{
if(degree(temp1) < degree(temp2))
{
tempX = temp1->powX;
tempY = temp1->powY;
tempZ = temp1->powZ;
tempCoeff = temp1->coeff;
temp1->powX = temp2->powX;
temp1->powY = temp2->powY;
temp1->powZ = temp2->powZ;
temp1->coeff = temp2->coeff;
temp2->powX = tempX;
temp2->powY = tempY;
temp2->powZ = tempZ;
temp2->coeff = tempCoeff;
}
temp1 = temp2;
temp2 = temp2->next;
}
}
t = poly;
while(t != NULL)
{
printf("%d %d %d %.3f\n",t->powX,t->powY,t->powZ,t->coeff);
t = t->next;
}
}
void addPolynomials(struct Node** result,struct Node* first,struct Node* second)
{
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
temp->next = NULL;
*result = temp;
while(first && second)
{
if(((first->powX*pow(10,2)) + (first->powY*pow(10,1)) + (first->powZ*pow(10,0))) < (((second->powX*pow(10,2)) + (second->powY*pow(10,1)) + (second->powZ*pow(10,0)))))
{
temp->coeff = second->coeff;
temp->powX = second->powX;
temp->powY = second->powY;
temp->powZ = second->powZ;
second = second->next;
}
else if(((first->powX*pow(10,0))) > (((second->powX*pow(10,0)))))
{
temp->coeff = first->coeff;
temp->powX = first->powX;
temp->powY = first->powY;
temp->powZ = first->powZ;
first = first->next;
}
else
{
temp->coeff = first->coeff + second->coeff;
temp->powX = first->powX;
temp->powY = first->powY;
temp->powZ = first->powZ;
first = first->next;
second = second->next;
}
if(first && second)
{
temp->next = (struct Node*)malloc(sizeof(struct Node));
temp = temp->next;
temp->next = NULL;
}
}
while(first || second)
{
temp->next = (struct Node*)malloc(sizeof(struct Node));
temp = temp->next;
temp->next = NULL;
if(second)
{
temp->coeff = second->coeff;
temp->powX = second->powX;
temp->powY = second->powY;
temp->powZ = second->powZ;
second = second->next;
}
else if(first)
{
temp->coeff = first->coeff;
temp->powX = first->powX;
temp->powY = first->powY;
temp->powZ = first->powZ;
first = first->next;
}
}
}
int main()
{
struct Node* first = NULL;
struct Node* second = NULL;
struct Node* result = NULL;
readPolynomial(&first);
readPolynomial(&second);
addPolynomials(&result,first,second);
displayPolynomial(result);
return 0;
}
样本输出:
3
1 6 0 -7
0 7 0 -6
7 0 0 1
5
1 0 1 9
0 7 0 -2
5 3 2 4
1 2 3 4
1 3 0 3
解决方法
编译时带有完整警告(在 gcc 中为 -Wall -Wextra
)。
在这种情况下,您将看到您没有包含 <string.h>
,C 允许隐式声明 (int (*)()
),但行为不是您想要的。
将以下内容添加到您的代码中,
#include <string.h>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。