急死我了机试之字符串的操作

文章讲述了在处理输入时,特别是在使用`gets()`函数的while(1)循环中,正确初始化输入的重要性。错误实例中,作者指出由于未初始化,导致输出覆盖新输入,通过将`gets(judgeString)`的条件从`!=NULL`改为显式检查输入结束,解决了这个问题。
摘要由CSDN通过智能技术生成

(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>库
  1. gets():自动\n,填充\0
  2. puts():自动换行
  3. 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);
		
		}
		


	}






}






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周树皮不皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值