将字符串与链表数据元素进行比较时,strcmp 不会 return 0
strcmp won't return 0 when comparing string to a linked list data element
我在使用链表程序时遇到一些问题,其中 strcmp 从不 returns 0,但它们是相等的。我尝试了 strcpy() 函数将 temp -> name 放入字符串,但它也没有用。我正在尝试将平均值分配给 temp -> average。
这是输入:
vloz Mrkvicka Jozko 1 1.25
vloz Hrusticka Ferko 2 1.5
vloz Kalerab Jurko 1 2.14
vloz Hrusticka Ferko 1 2.8
vloz Zeler Misko 1 4.12
vypis
zmen Hrusticka Ferko 3.0
vypis
我的输出应该是这样的:
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=3.00 //current 2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=3.00 //current 1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
我目前的输出:
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
这是我的完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char firstname[50];
char lastname[50];
int year;
double average;
struct student *next;
};
struct database
{
struct student *first;
};
struct database *create_head ()
{
struct database *head = (struct database *)malloc(sizeof(struct database));
head -> first = NULL;
return head;
}
void vloz (struct database *head)
{
struct student *temp = (struct student *) malloc (sizeof(struct student));
temp -> next = NULL;
char firstname[50];
char lastname[50];
int year;
double average;
scanf("%s %s %d %lf\n", firstname, lastname, &year, &average);
strcpy(temp -> firstname, firstname);
strcpy(temp -> lastname, lastname);
temp -> year = year;
temp -> average = average;
temp -> next = head -> first;
head -> first = temp;
return;
}
void zmen (struct database *head)
{
char firstname[50];
char lastname[50];
double average;
scanf("%s %s %lf", lastname, firstname, &average);
struct student *temp = head -> first;
while (temp != NULL)
{
if (strcmp(temp -> firstname, firstname) == 0)
{
printf("TTT\n");
temp -> average = average;
}
temp = temp -> next;
}
}
void vypis (struct database *head)
{
struct student *temp = head -> first;
while (temp != NULL)
{
printf("lastname=%s, firstname=%s, year=%d, average=%.2lf\n", temp -> firstname, temp -> lastname, temp -> year, temp -> average);
temp = temp -> next;
}
printf("\n");
}
int main()
{
char prikaz[20];
struct database *head = create_head();
while (scanf("%s", prikaz) > 0)
{
if (strcmp(prikaz, "vloz") == 0)
{
if (head->first != NULL)
{
struct database *head = create_head();
}
vloz (head);
}
if (strcmp(prikaz, "vypis") == 0)
vypis (head);
if (strcmp(prikaz, "zmen") == 0)
zmen (head);
}
return 0;
}
发布的代码有一些问题,但没有解释您的观察结果。
问题一定出在其他地方,在您编写的用于解析文件和构建列表的函数中。 Post 表现出意外行为的工作程序的完整代码。
您的代码存在一些问题:
- 您应该始终检查
scanf()
的 return 值以检测文件末尾的无效输入。
- 您应该删除
scanf("%s %s %d %lf\n", firstname, lastname, &year, &average);
中的尾随换行符,它会导致 scanf()
继续阅读,直到获得非空输入。
读取字符串时应防止缓冲区溢出:
scanf("%49s %49s %lf", lastname, firstname, &average);
测试if (head->first != NULL) { struct database *head = create_head(); }
没用:如果列表不为空,则将新树分配给立即超出范围的新局部变量。
您在扫描功能中没有正确比较名称。
请为您的函数使用英文名称,je ne comprends pas le slovaque。
这是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
char firstname[50];
char lastname[50];
int year;
double average;
struct student *next;
};
struct database {
struct student *first;
};
struct database *create_head(void) {
struct database *head = malloc(sizeof(struct database));
head->first = NULL;
return head;
}
void vloz(struct database *head) {
struct student *temp = malloc(sizeof(struct student));
if (temp == NULL) {
printf("out of memory\n");
return;
}
char firstname[50];
char lastname[50];
int year;
double average;
if (scanf("%49s %49s %d %lf", firstname, lastname, &year, &average) != 4) {
printf("invalid input\n");
return;
}
strcpy(temp->firstname, firstname);
strcpy(temp->lastname, lastname);
temp->year = year;
temp->average = average;
temp->next = head->first;
head->first = temp;
}
void zmen(struct database *head) {
char firstname[50];
char lastname[50];
double average;
if (scanf("%49s %49s %lf", firstname, lastname, &average) != 3) {
printf("invalid input\n");
return;
}
struct student *temp = head->first;
while (temp != NULL) {
if (strcmp(temp->firstname, firstname) == 0
&& strcmp(temp->lastname, lastname) == 0) {
printf("TTT\n");
temp->average = average;
}
temp = temp->next;
}
}
void vypis(struct database *head) {
struct student *temp = head->first;
while (temp != NULL) {
printf("lastname=%s, firstname=%s, year=%d, average=%.2lf\n",
temp->firstname, temp->lastname, temp->year, temp->average);
temp = temp->next;
}
printf("\n");
}
int main() {
char prikaz[20];
struct database *head = create_head();
while (scanf("%19s", prikaz) == 1) {
if (strcmp(prikaz, "vloz") == 0)
vloz(head);
else
if (strcmp(prikaz, "vypis") == 0)
vypis(head);
else
if (strcmp(prikaz, "zmen") == 0)
zmen(head);
}
return 0;
}
您调换了名字和姓氏,因此比较无效。
在 vloz 中它看起来像这样:
scanf("%s %s %d %lf\n", firstname, lastname, &year, &average);
而在 zmen 中,scanf 的第一个元素是姓氏:
scanf("%s %s %lf", lastname, firstname, &average);
如果你在 zmen 中切换顺序,它看起来像:
scanf("%s %s %lf", lastname, firstname, &average);
您将获得预期的输出。
调试输出
当使用正确的顺序时,调试控制台中的输出类似于预期值:
我在使用链表程序时遇到一些问题,其中 strcmp 从不 returns 0,但它们是相等的。我尝试了 strcpy() 函数将 temp -> name 放入字符串,但它也没有用。我正在尝试将平均值分配给 temp -> average。
这是输入:
vloz Mrkvicka Jozko 1 1.25
vloz Hrusticka Ferko 2 1.5
vloz Kalerab Jurko 1 2.14
vloz Hrusticka Ferko 1 2.8
vloz Zeler Misko 1 4.12
vypis
zmen Hrusticka Ferko 3.0
vypis
我的输出应该是这样的:
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=3.00 //current 2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=3.00 //current 1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
我目前的输出:
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
这是我的完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char firstname[50];
char lastname[50];
int year;
double average;
struct student *next;
};
struct database
{
struct student *first;
};
struct database *create_head ()
{
struct database *head = (struct database *)malloc(sizeof(struct database));
head -> first = NULL;
return head;
}
void vloz (struct database *head)
{
struct student *temp = (struct student *) malloc (sizeof(struct student));
temp -> next = NULL;
char firstname[50];
char lastname[50];
int year;
double average;
scanf("%s %s %d %lf\n", firstname, lastname, &year, &average);
strcpy(temp -> firstname, firstname);
strcpy(temp -> lastname, lastname);
temp -> year = year;
temp -> average = average;
temp -> next = head -> first;
head -> first = temp;
return;
}
void zmen (struct database *head)
{
char firstname[50];
char lastname[50];
double average;
scanf("%s %s %lf", lastname, firstname, &average);
struct student *temp = head -> first;
while (temp != NULL)
{
if (strcmp(temp -> firstname, firstname) == 0)
{
printf("TTT\n");
temp -> average = average;
}
temp = temp -> next;
}
}
void vypis (struct database *head)
{
struct student *temp = head -> first;
while (temp != NULL)
{
printf("lastname=%s, firstname=%s, year=%d, average=%.2lf\n", temp -> firstname, temp -> lastname, temp -> year, temp -> average);
temp = temp -> next;
}
printf("\n");
}
int main()
{
char prikaz[20];
struct database *head = create_head();
while (scanf("%s", prikaz) > 0)
{
if (strcmp(prikaz, "vloz") == 0)
{
if (head->first != NULL)
{
struct database *head = create_head();
}
vloz (head);
}
if (strcmp(prikaz, "vypis") == 0)
vypis (head);
if (strcmp(prikaz, "zmen") == 0)
zmen (head);
}
return 0;
}
发布的代码有一些问题,但没有解释您的观察结果。
问题一定出在其他地方,在您编写的用于解析文件和构建列表的函数中。 Post 表现出意外行为的工作程序的完整代码。
您的代码存在一些问题:
- 您应该始终检查
scanf()
的 return 值以检测文件末尾的无效输入。 - 您应该删除
scanf("%s %s %d %lf\n", firstname, lastname, &year, &average);
中的尾随换行符,它会导致scanf()
继续阅读,直到获得非空输入。 读取字符串时应防止缓冲区溢出:
scanf("%49s %49s %lf", lastname, firstname, &average);
测试
if (head->first != NULL) { struct database *head = create_head(); }
没用:如果列表不为空,则将新树分配给立即超出范围的新局部变量。您在扫描功能中没有正确比较名称。
请为您的函数使用英文名称,je ne comprends pas le slovaque。
这是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
char firstname[50];
char lastname[50];
int year;
double average;
struct student *next;
};
struct database {
struct student *first;
};
struct database *create_head(void) {
struct database *head = malloc(sizeof(struct database));
head->first = NULL;
return head;
}
void vloz(struct database *head) {
struct student *temp = malloc(sizeof(struct student));
if (temp == NULL) {
printf("out of memory\n");
return;
}
char firstname[50];
char lastname[50];
int year;
double average;
if (scanf("%49s %49s %d %lf", firstname, lastname, &year, &average) != 4) {
printf("invalid input\n");
return;
}
strcpy(temp->firstname, firstname);
strcpy(temp->lastname, lastname);
temp->year = year;
temp->average = average;
temp->next = head->first;
head->first = temp;
}
void zmen(struct database *head) {
char firstname[50];
char lastname[50];
double average;
if (scanf("%49s %49s %lf", firstname, lastname, &average) != 3) {
printf("invalid input\n");
return;
}
struct student *temp = head->first;
while (temp != NULL) {
if (strcmp(temp->firstname, firstname) == 0
&& strcmp(temp->lastname, lastname) == 0) {
printf("TTT\n");
temp->average = average;
}
temp = temp->next;
}
}
void vypis(struct database *head) {
struct student *temp = head->first;
while (temp != NULL) {
printf("lastname=%s, firstname=%s, year=%d, average=%.2lf\n",
temp->firstname, temp->lastname, temp->year, temp->average);
temp = temp->next;
}
printf("\n");
}
int main() {
char prikaz[20];
struct database *head = create_head();
while (scanf("%19s", prikaz) == 1) {
if (strcmp(prikaz, "vloz") == 0)
vloz(head);
else
if (strcmp(prikaz, "vypis") == 0)
vypis(head);
else
if (strcmp(prikaz, "zmen") == 0)
zmen(head);
}
return 0;
}
您调换了名字和姓氏,因此比较无效。
在 vloz 中它看起来像这样:
scanf("%s %s %d %lf\n", firstname, lastname, &year, &average);
而在 zmen 中,scanf 的第一个元素是姓氏:
scanf("%s %s %lf", lastname, firstname, &average);
如果你在 zmen 中切换顺序,它看起来像:
scanf("%s %s %lf", lastname, firstname, &average);
您将获得预期的输出。
调试输出
当使用正确的顺序时,调试控制台中的输出类似于预期值: