title: 锐格-5812-题解
tags:

  • C
  • 锐格
    abbrlink: 5135e9c8
    date: 2021-03-26 20:09:15

这题实在是太坑了以至于有必要拿出来单独说一说

题目

锐格-5812-题解 - 图1

BUGs

一开始的逻辑做出来以后有一个很奇怪的现象,就是如果正常处理的话,那么有一组数据开头会多出来两个空格,然而当我debug时候把printf(“Reversal of sentence “);这一句最后的空格去掉以后,那三个空格又会全部消失…非常的灵异,而且一直无法复现这个数据究竟是怎么出来的

fix

在询问了老师和众多dalao后,我终于复现出来了这个问题,那就是当你在you can swallow can't you?最后一个单词you和问号之间打了空格的话,那么按照之前的处理逻辑,是以空格作为间隔符,而最后一个单词判断过程中最后一个单词的结束到问号之间没有再做判断,直接就放进了数组,同样,最后一个符号(在此处是问号)也只进行了非字符的判定,所以在上述情况,这个最后一个字符保存的还是一个空格,所以就会多出来两个空格,原来问题是出在这里。

知道了问题,解决起来就i比较简单了,我只要每次操作都先把空格排除在外,遇到非空格时候才继续进行读入操作,这样输出时候就不会有多余的空格出现了。

Code

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6. int i=0,j=0,n=0;
  7. char a[1000],word[50][50],c;
  8. printf("Enter a sentence: ");
  9. gets(a);
  10. printf("Reversal of sentence: ");
  11. c=a[strlen(a)-1];
  12. a[strlen(a)-1]='\0';
  13. while(a[i]!='\0'&&a[i]!='\r'&&a[i]!='\n')
  14. {
  15. while(a[i]==' ')//关键步骤
  16. i++;
  17. if(a[i]=='\0'||a[i]=='\r'||a[i]=='\n')
  18. break;
  19. j=0;
  20. while(a[i]!=' '&&a[i]!='\r'&&a[i]!='\n')
  21. {
  22. word[n][j]=a[i];
  23. i++;j++;
  24. }
  25. word[n][j]='\0';
  26. n++;
  27. }
  28. for(i=n-1;i>=0;i--)
  29. {
  30. if(i==n-1)
  31. printf("%s",word[i]);
  32. else
  33. printf(" %s",word[i]);
  34. }
  35. printf("%c\n",c);
  36. return 0;
  37. }