【发布时间】:2019-03-06 08:31:28
【问题描述】:
我在结构中有一堆练习题,所有都涉及作为指向函数参数的指针传递的结构。现在,我手头有一个特定的问题,它要求我将一些姓名和电话号码存储在电话簿结构中。内容如下:
编写一个实现以下两个函数的 C 程序。函数
readin()读取多个 人的姓名及其相应的电话号码,将数据传递给呼叫者 通过参数p,并返回已输入的名称数量。使用字符#指示用户输入的结束。函数search()查找输入姓名的电话号码 目标,然后在屏幕上打印姓名和电话号码。如果输入的名称不能 找到,然后它将打印适当的错误消息。这两个函数的原型如下:
int readin(PhoneBk *p);
void search(PhoneBk *p, int size, char *target);
PhoneBk 的结构定义如下:
typedef struct {
char name[20];
char telno[20];
} PhoneBk;
节目模板如下:
#include <stdio.h>
#include <string.h>
#define MAX 100
typedef struct {
char name[20];
char telno[20];
} PhoneBk;
int readin(PhoneBk *p);
void search(PhoneBk *p, int size, char *target);
int main() {
PhoneBk s[MAX];
char t[20];
int size;
size = readin(s);
printf("Enter search name: \n");
gets(t);
search(s, size, t);
return 0;
}
int readin(PhoneBk *p) {
/* Write your program code here */
}
void search(PhoneBk *p, int size, char *target) {
/* Write your program code here */
}
我必须在我的程序中比较字符串两次:一,检查是否输入了 # 作为名称(在这种情况下,我希望程序直接跳转到搜索功能而不询问电话号码);第二,如果目标名称与其中一个电话簿结构中的名称匹配。
现在我对声明为数组但作为指针传递的结构的概念完全陌生,所以我认为获取下一条记录的用户输入的方法是递增指针变量 (这里p)。对于 get-the-records-until-#-is-entered 函数,我写了这个(使用strcmp):
int readin(PhoneBk *p) {
strcpy(p->name, "Test"); //To guarantee a character that is not #.
while (strcmp(p->name, "#") != 0) {
printf("Enter person name, # to stop.\n");
scanf("%s", p->name);
printf("Enter the telephone number.\n");
scanf("%s", p->telno);
p++;
}
return p;
}
我的意图是将p->name 转换为字符串,以便strcmp() 可以处理它。但是反复显示警告:
warning: cast from pointer to integer of different size
warning: passing argument 1 of strcmp() makes pointer from integer without a cast
这个错误已经在论坛上讨论过很多次(我搜索过),但我所看到的对于这种结构和strcmp() 的组合没有任何帮助。
我完全放弃了strcmp(),转而使用第二个函数,即在找到目标名称时显示人员记录的函数,因此我使用循环直接比较字符串。
void search(PhoneBk *p, int size, char *target) {
int i, flag = 1, strCompare;
char c1 = *(p->name), c2 = *target, p1 = p->name, p2 = target;
while (c1 != '\0' && c2 != '\0') { //Comparing strings.
strCompare = (int)(c1 - c2);
if (strCompare != 0)
break;
else {
p1++;
p2++;
}
}
for (i = 0; i < size; i++, p++) {
if (strCompare == 0) {
flag = 0;
printf("Name = %s, Tel. = %s\n", p->name, p->telno);
}
if (flag == 1)
printf("Name not found.\n");
}
}
但我又收到了一些警告。
warning: cast from pointer to integer of different size
warning: initialization makes pointer from integer without a cast
我真的认为如果结构都作为数组传递,我的生活会更轻松,在这种情况下,我可以简单地使用 For 循环遍历结构数组并完成它。这是我在整个高中期间一直在做的事情,但现在我在大学里,我不得不处理作为指针传递的结构。
在这种情况下我该如何处理strcmp()?这如何应用于任何将结构作为指针传递的程序?
【问题讨论】:
-
关于简单语法错误的长问题。将
strcmp((char)p->name, "#")更改为strcmp(p->name, "#")。单个char不是字符串,因此是警告。 -
永远不要使用
gets! a dangerous function 甚至已从 C 标准中删除。使用例如fgets代替,但要注意它与gets的区别。 -
其实这里的问题似乎是你期望单个
char是C 的字符串类。C 中没有 没有字符串类。一切都是原始的,手动数组,char[]。所以你的问题实际上是“如何在 C 中进行字符串处理”,这是一个太大的话题,无法在这里回答。答案是阅读 C 书籍中关于字符串的章节。 -
至于程序的其余部分,如果编译器还没有对您发出警告,则启用更多警告并将它们视为错误。例如,您真的从
readin函数返回什么? -
而您的
search函数似乎只进行了一些字符串比较(以非常复杂的方式)。您实际上并没有搜索PhoneBk元素的 array 来找到相应的元素。