【发布时间】:2014-04-28 20:58:41
【问题描述】:
我试图让一个程序运行,它基本上接受一个输入字符串并通过一些代码发送它,并使用链表按字母顺序对其进行排序。我已经想出了如何使用手动(在实际代码中)文本输入来完成这项工作,但是当我试图从用户那里获取输入时,我无法让它工作。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct llist {
char *value;
struct llist *next;
};
int compare (struct llist *one , struct llist *two)
{
return strcmp(one->value, two->value);
}
void add(struct llist **pp, char *value, int (*cmp)(struct llist *l, struct llist *r)) {
struct llist *new;
new = malloc(sizeof(*new));
new->value = value;
for ( ; *pp != NULL; pp = &(*pp)->next) {
if (cmp(*pp, new) > 0 ) break;
}
new->next = *pp;
*pp = new;
}
void display(struct llist *ptr) {
for (; ptr != NULL; ptr = ptr->next) {
printf("%s\n", ptr->value);
}
}
int main(void) {
struct llist *root = NULL;
char string;
printf("Please enter a string to be sorted alphabetically and displayed with a character count: ");
string = getchar();
while (string != 10){
add(&root,&string, compare);
string = getchar();
}
display(root);
return 0;
}
查看 main 函数,我很确定它与 getchar 以及它以整数形式读取字符的事实有关,但我不知道如何解决这个问题,输出只是一堆空行。但是当while循环被删除并在main中输入如下字符串时,它工作正常吗?为什么会这样?
int main(void) {
struct llist *root = NULL;
char string;
printf("Please enter a string to be sorted alphabetically and displayed with a character count: ");
add(&root,"t", compare);
add(&root,"h", compare);
add(&root,"i", compare);
add(&root,"s", compare);
add(&root,"m", compare);
add(&root,"y", compare);
add(&root,"t", compare);
add(&root,"e", compare);
add(&root,"x", compare);
add(&root,"t", compare);
display(root);
return 0;
}
现在的输出是 e H 一世 米 s 吨 吨 吨 X 是的
这是正确的, 谁能帮我?
【问题讨论】:
-
注意:为什么使用
string != 10而不是string != '\n'? -
我原来是用那个的,不知道为什么我改了,但是我把它改回来了,因为它确实更有意义
-
代码通过
strcmp()“比较”,它接受字符串。字段value是&string的副本,是一个指向char但没有'\0'终止符的指针。 -
是的,这就是 shf301 所说的,我修复了它,但不幸的是它仍然没有帮助我的输出:/