user-0 提问: 个人设计，打印输入中各个字符出现频度的直方图，出现问题求教谢谢。

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-0
content: 非常感谢两位指导，我重新编写了下程序后，依旧 ctrl+f5运行 输入hollow world(小学的时候一直以为是hellow，记习惯了，没改回来。。) 程序停止运行      #include <stdio.h> #define MAXCODE 256 /*最大储存为128，冗余128*/   main() { 	int c,q;  	char a[MAXCODE]; /*字符*/ 	int s[MAXCODE] = { 0 }; /*字符出现的次数*/ 	 	 q = 0;   	while ((c = getchar()) != EOF) 	{ 		a[q] = c;/*有新的字符*/ 		 		for (int i = 0; i < q; i++)/*字符 循环重复检测*/ 		{ 			if (a[q] == a[i])/*新出现的字符与已存字符作对比，若相同则此字符次数++。*/ 			{ 				++s[i]; 				--q; 				break; 			} 			 		} 		++q; 	} 	for (int n = 0; n < q; n++) 	{ 		printf("%s", a[n]);/*输出以p为顺序的字符*/ 		for (int m = 0; m < s[n]; m++) 		{ 			printf("*");/*输出出现字符的次数*/ 		} 		printf("\n");/*输出*结束后，换行*/ 	} 	system("pause"); 	return 0; }

user: user-0
content: 引用 8 楼 super_miker 的回复:        printf("%s", a[n]);/*输出以p为顺序的字符*/  这里用%c，%s是字符串  哦，非常感谢~解决了。 tks~~

user: user-2
content: printf("%s", a[n]);/*输出以p为顺序的字符*/  这里用%c，%s是字符串

user: user-2
content: for (int i = 0; i < MAXCODE; i++)/*字符 循环重复检测*/ MAXCODE改为q for (int n = 0; n < MAXCODE; n++) 同上              if (a[q] == a[i])/*新出现的字符与已存字符作对比，若相同则此字符次数++。*/             {                 ++s[i];                 --q;             }  加个break;              if (m==s[n])/*最后换行*/             {                 printf("\n");             }  移到循环外部并去掉if语句.  顺便hellow是什么鬼...

user: user-3
content: for ( i = 0; i < q; i++)/*字符 循环重复检测，只需要和已记录的对比*/  			{ 				if (a[q] == a[i])/*新出现的字符与已存字符作对比，若相同则此字符次数++。*/ 				{ 					++s[i]; 					--q; 					break; 				} 			}  			if(i == q)/*没有找到重复的话，s[i]=1，*/ 			{ 				s[i]++; 			}  			++q;

user: user-3
content: 引用 3 楼 w3xse7en 的回复:[quote=引用 2 楼 user-3 的回复:] [quote=引用 1 楼 user-3 的回复:] 没去运行过代码，看了下             if (a[q] == a[i])/*新出现的字符与已存字符作对比，若相同则此字符次数++。*/             {                 ++s[i];                 --q;//这个地方需要跳出循环，直接continue，                continue;             }   说错了，是break;[/quote]  我这里加上去试了下还是停止工作了。[/quote]  写代码逻辑很重要，得清楚你前后的关系，例如你这里的变量q，肯定是记录的字符的个数，那么在打印字符的时候，那么就不该是  for (int n = 0; n < MAXCODE; n++) MAXCODE要换成q  s[i]记录的是对应a[i]字符出现的个数，打印*是没问题的。 但是             if (m==s[n])/*最后换行*/             {                 printf("\n");             } m是无法等于s[n]的，这个需要看下基础知识。         for (int m = 0; m < s[n]; m++)         {             printf("*");/*输出出现字符的次数*/         }            if (m==s[n])/*最后换行*/             {                 printf("\n");             }

user: user-0
content: 引用 2 楼 user-3 的回复:[quote=引用 1 楼 user-3 的回复:] 没去运行过代码，看了下             if (a[q] == a[i])/*新出现的字符与已存字符作对比，若相同则此字符次数++。*/             {                 ++s[i];                 --q;//这个地方需要跳出循环，直接continue，                continue;             }  说错了，是break;[/quote]  我这里加上去试了下还是停止工作了。

user: user-3
content: 引用 1 楼 user-3 的回复:没去运行过代码，看了下             if (a[q] == a[i])/*新出现的字符与已存字符作对比，若相同则此字符次数++。*/             {                 ++s[i];                 --q;//这个地方需要跳出循环，直接continue，                continue;             }  说错了，是break;

user: user-3
content: 没去运行过代码，看了下             if (a[q] == a[i])/*新出现的字符与已存字符作对比，若相同则此字符次数++。*/             {                 ++s[i];                 --q;//这个地方需要跳出循环，直接continue，                continue;             }