int main()
{
char arr[100] = {0};
//scanf("%s\n", arr);
scanf("%[^\n]", arr);
//gets(arr);
printf("%s\n", arr);
return 0;
}
获取字符串中的空格,如果要用scanf,则采用canf("%[^\n]", arr);格式
我的思考:
int main()
{
char a[100] = { 0 };
gets(a);
int b, n = strlen(a);
while (a[n] <= 'A' || a[n] >= 'Z')
{
while (a[n] != ' ')
{
n--;
}
for (b = 1; a[n + b] != NULL && a[n + b] != ' '; b++)
{
printf("%c", a[n + b]);
}
printf(" ");
n--;
}
printf("%c", a[n]);
}
虽然也可以进行,但运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
优化改进
int main()
{
char a[100] = { 0 };
gets(a);
int i=0,b, n = strlen(a);
for (i = 0; i < n; i++)
{
if (a[i] == ' ')
{
break;
}
}
while ((n-i)>0)
{
while (a[n] != ' ')
{
n--;
}
for (b = 1; a[n + b] != '\0' && a[n + b] != ' '; b++)
{
printf("%c", a[n + b]);
}
printf(" ");
n--;
}
for (b = 0; b < i; b++)
{
printf("%c", a[b]);
}
}
进一步优化
#include <stdio.h>
#include <assert.h>
void reverse(char* l, char* r)
{
assert(l && r);
while (l < r)
{
char tmp = *l;
*l = *r;
*r = tmp;
l++;
r--;
}
}
int main()
{
char arr[100] = { 0 };
//输入
gets(arr);
int len = strlen(arr);
//逆序
//1. 逆序整个字符串
char* left = arr;
char* right = arr + len - 1;
reverse(left, right);
//2. 逆序每个单词
char* cur = arr;
char* start = arr;
while (*cur != '\0')
{
while (*cur != ' ' && *cur != '\0')
{
cur++;
}
reverse(start, cur - 1);
start = cur + 1;
if (*cur != '\0')
cur++;
}
printf("%s\n", arr);
return 0;
}
这题使用三步翻转法,即先将字符串整体逆置,再对逆置后的字符串中每一个单词部分进行逆置。
比如:I like beijing.
第一步,字符串整体逆置,得到:.gnijieb ekil I
第二步,将字符串中每一个单词逆置,得到:beijing. like I
这里字符串操作的实现非常关键,故单独实现一个函数进行字符串的逆置,由于每个单词的长度不一,因此通过指针来实现字符串的逆置可以对代码进行简化