(nowcoder原题链接)[https://www.nowcoder.com/practice/4ec4325634634193a7cd6798037697a8?tpId=63&tqId=29574&tPage=1&ru=/kaoyan/retest/9001&qru=/ta/zju-kaoyan/question-ranking]
分析
- <string.h>库
- gets():自动\n,填充\0
- puts():自动换行
- strlen():用于for循环条件
- while(1)循环输入
代码改进
错误实例:把自己的输出当成新的输入,覆盖了输出.我自己猜的原因,是gets()函数在输入时没有准确的初始化而导致出错。
参考别人的代码
将
method1
while(1){
gets(judgeString);
改成了
method2
while(gets(judgeString)!=NULL)
-
method1
while(gets(judgeString)!=NULL):在此构造中,循环条件显式地与gets函数的返回值相关联。只要gets成功读取一行输入(即返回一个非 NULL 指针),循环就会继续。当gets到达输入末尾或遇到错误时,它返回NULL,这会导致循环退出。
judgeString在进入循环之前,使用第一行输入初始化该变量。 -
method2
while(1):这是一个通用的无限循环。它将无限期地继续运行,直到break遇到语句。
第一行输入被读入judgeString循环内,然后if(judgeString[0]==‘#’)检查条件以确定是否应退出循环。
循环没有固有的输入条件;它启动时没有任何与输入相关的初始化。
就功能而言,两种构造是等效的,并且对于给定任务的行为方式相同。但是,第一个构造明确地将循环条件与输入读数联系起来,而第二个构造是更通用的无限循环,包括循环体内的输入读数和条件检查。
总结大致就是,在while(1)中缺少了使用新键盘输入的字符串进行初始化的判断,导致使用上一轮的输出进行赋值,最终使程序出错。
运行代码
#include <stdio.h>
#include <string.h>
#define Max1 5
#define Max2 50
//所以输入的while循环不应该将输出搞进去
//why??????
//est string
//this is a long test string
//我定义宏就出错
int main() {
char judgeString[Max1];
char allString[Max2];
int cnt;
int i,j;
while(gets(judgeString)!=NULL){
if(judgeString[0]=='#'){
break;
}
gets(allString);
//1.judege &count
for(i=0;i<strlen(judgeString);i++){
cnt=0;//每次重新初始化
for(j=0;j<strlen(allString);j++){
if(allString[j]==judgeString[i]){
cnt+=1;
}
}
printf("%c %d\n",judgeString[i],cnt);
}
}
}