【发布时间】:2018-05-08 17:49:31
【问题描述】:
我已经在这段代码上工作了几天,这就是我想出的地方(我之前在这里问过)。代码点是打印给定字符串上每个字母的出现次数,仅更改letters() 和report()。
我在letters() 中添加了printf,看看发生了什么。我不太确定在函数letters() 中是否需要第一个循环,但它正在打印整个输入的字符串。另外,如果我不把第一个循环放在letters() 中,那么report() 中的电流是NULL(为什么???)。 letters() 中的第二个循环只打印输入字符串的最后一个字母(为什么?)。而report() 再次只打印字符串的最后一个字母,current->occurences 打印一个随机的 6 位数字(可能是内存地址?),还报告永远持续,这意味着当前永远不会变成 NULL??? .我已经为此工作了好几天,我不明白为什么letters() 和report() 上的第二个循环不起作用,它们对我来说似乎是正确的。任何帮助表示赞赏...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct charact {
char ch;
int occurs;
struct charact *next;
};
typedef struct charact Char;
typedef Char * ListofChar;
typedef Char * CharNode_ptr;
void letters(char name[50], ListofChar * chars_ptr);
void report(ListofChar chars);
Char * createnode(char ch);
int main() {
char name[50];
ListofChar chars = NULL;
scanf("%s", name);
letters(name,&chars);
report(chars);
return 0;
}
Char * createnode(char ch) {
CharNode_ptr newnode_ptr ;
newnode_ptr = malloc(sizeof (Char));
newnode_ptr -> ch = ch;
newnode_ptr -> occurs = 0;
newnode_ptr -> next = NULL;
return newnode_ptr;
}
void letters(char name[50],ListofChar* lst_ptr){
ListofChar newnode ;
newnode =(Char*)malloc(sizeof(Char));
if(!newnode){printf("adinamia mnimis");}
int i,j;
for( i = 0 ; i < strlen(name) ; i++){
newnode->ch = name[i] ;
printf("Look: %c\n",newnode->ch);
newnode->next = *lst_ptr ;
*lst_ptr = newnode ;
}
for( i = 0 ; i < 50 ; i++){
for( j = 0 ; j < strlen(name) ; j++){
if (newnode->ch == name[i]){
newnode->occurs++;
printf("uhm : %c\n",newnode->ch) ;
newnode = newnode->next;
break;
}
printf("hey : %c\n",newnode->ch);
}
}
}
void report(ListofChar chars) {
ListofChar current ;
current = chars ;
printf("the occurences of each letter are:\n");
while(current != NULL){
printf("%c : %d\n", current->ch,current->occurs );
current = current->next ;
}
if(current==NULL)printf("fail");
return;
}
【问题讨论】:
-
SO 是一个糟糕的调试器!在编码时,您将学到的最重要的技能是如何调试自己的代码。 ericlippert.com/2014/03/05/how-to-debug-small-programs 如果你需要帮助,你需要整理你的解释,因为这段文字几乎无法阅读。告诉我们您想做什么、尝试过什么以及获得了什么结果。
-
快速说明 - 避免在指针上使用 typedef,只会让你的生活变得悲惨
-
您的老师需要学习如何编写清晰、可维护的 C 代码。请建议您的老师将问题代码提交给codereview.stackexchange.com。
-
当(且仅当)您遇到从未遇到过的信件时,您需要致电
createnode()。它需要在name中每个字符的循环内,而不是在它之前。
标签: c pointers struct linked-list nodes