因为scanf读取的问题,以回车结尾时,\n仍在缓冲区,会自动流入下一个读取行,导致后边第一个字符串读取失败,直接没有进入for循环。且让字符串进了while(scanf("%d",&p)!=EOF)里,但是这里字符串用%d没有报错,后边一直无限循环才找出了问题。
@Override
#include<stdio.h>
#include<String.h>
void f(char str[],int m,int n)
{
for(int i=m;i<n;i++)
{
printf("%c",str[i]);
}
printf(" ");
}
int main()
{
int p;
while(scanf("%d\n",&p)!=EOF)
{
for(int k=0;k<p;k++)
{
char str[100];
gets(str); //回车残余
int len=strlen(str);
int m=0;
int n=0;
int num=0;
int i=0;
for( i=0;i<len;i++)
{
// printf("zhe");
if(('a'<=str[i]&&str[i]<='z')||('A'<=str[i]&&str[i]<='Z'))
{
n=i+1;
if(str[i+1]=='\0')
{
n=i+1;
f(str,m,n);
num++;
}
}
else
{
if(m<n)
{
f(str,m,n);
num++;
}
m=n+1;
n=m;
}
}
// printf("m=%d n=%d k=%d p=%d len=%d i=%d str[i]=%c!",m,n,k,p,len,i,str[i]);
printf("\n分出了%d个单词\n",num);
}
}
return 0;
}
主要是最后一个空格的问题
#include<stdio.h>
//#include<String.h>
void f(char str[],int m,int n)
{
for(int i=m;i<n;i++)
{
printf("%c",str[i]);
}
// printf(" ");
int k=0;
int j;
for(j=0;j<m;j++)
{
if(str[j]!=' ')
k=1;
}
if(k) printf(" ");
}
int main()
{
char str[100];
while(gets(str)!=NULL)
{
printf("Enter a sentence: ");
printf("Reversal of sentence: ");
int i;
int m=strlen(str)-1;
int n=strlen(str)-1;
char a=str[n];
for(i=n-1;i>=0;i--)
{
if(('a'<=str[i]&&str[i]<='z')||('A'<=str[i]&&str[i]<='Z')||(str[i]=='\''))
{
m=i;
if(i==0)
{
f(str,m,n);
n=m-1;
m=n;
}
}
else // if(str[i+1]==' '||str[i+1]=='!'||str[i+1]=='.'||str[i+1]==','||str[i+1]=='-')
{
if(m<n)
f(str,m,n);
n=m-1;
m=n;
// n++;
}
}
printf("%c",a);
}
return 0;
}
5881中这位大佬很巧地通过多次使用了一维数组完成
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define N 5
int main()
{
int n;
double sc[N],total[N];//sc存个人的三门,total存每门课总分
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int i=0;i<3;i++)
scanf("%lf",&sc[i]);
double sum=0;//sum存个人总分
for(int i=0;i<3;i++)
{
sum+=*(sc+i);
total[i]+=*(sc+i);
}
printf("%.2lf %.2lf\n",sum,sum/3.0);
}
for(int i=0;i<3;i++)
printf("%.2lf %.2lf\n",*(total+i),*(total+i)/n);
}
return 0;
}