额。。。醉了,这代码块是什么鬼,我要晕了,粘贴错了代码块,好了。我现在完全明白代码块了,全部重新发一遍,楼主忽略前面的就行
int main()
{
char str[101], s[20][20]; //str用于输入字符串,s用来存储字符串
int n, i, j, count;
//这里是第一个问题,使用scanf输入字符串会以空格或回车分隔
//scanf("%s", &str);
gets(str);
i = j = 0;
for (n = 0; n < strlen(str); n++)
{
if (str[n] == '\0')
{
break;
}
else if (str[n] != ' '&& str[n] != ',' && str[n] != '.')
{
s[i][j] = str[n];
j++; //将单词每个字母依次存入列中
}
else
{
//这里会有第二个问题,字符串会以'\0'作为结束的标识符
//那么你一行读取往后应当在填充一个'\0'
s[i][j] = '\0';
i++; //记录单词个数
j = 0; //初始化列序数
}
}
//这里每执行一次完后面的else都会i++,最后一次也不例外,所以要减掉
if(str[n-1] == ' ' || str[n-1] == ',' || str[n-1] == '.')
i--;
else//这里因为上面循环中的最后else未执行,使用要补'\0'
s[i][j] = '\0';
count = i; //单词个数
for (i = count; i >= 0; i--)
{
//这是第三个问题,你能确定每个单词都是20个吗?
//for (j = 0; j < 20; j++)
//{
// printf("%c", s[i][j]); //倒序依次输出每个单词
//}
printf("%s",s[i]); //直接以字符串形式输出即可
printf(" ");
}
return 0;
}//我为以上程序进行了说明,下面简洁版,去掉这些注释,下面程序进行过测试,无问题
最终程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[101], s[20][20]; //str用于输入字符串,s用来存储字符串
int n, i, j, count;
gets(str);
i = j = 0;
for (n = 0; n < strlen(str); n++)
{
if (str[n] == '\0')
{
break;
}
else if (str[n] != ' '&& str[n] != ',' && str[n] != '.')
{
s[i][j] = str[n];
j++; //将单词每个字母依次存入列中
}
else
{
s[i][j] = '\0';
i++; //记录单词个数
j = 0; //初始化列序数
}
}
if(str[n-1] == ' ' || str[n-1] == ',' || str[n-1] == '.')
i--;
else
s[i][j] = '\0';
count = i; //单词个数
for (i = count; i >= 0; i--)
{
printf("%s",s[i]); //直接以字符串形式输出即可
printf(" ");
}
return 0;
}
还有一个问题留给你自己思考,你做的应该是ACM,按照你最后的这样输出每个单词后面都会输出一个空格,但是一般来讲(自己做题来讲),最后一个空格都是不需要的,你在仔细看看题目的需求样例