牛客网刷题遇到的问题

问题描述:接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000) 输入一行,为只包含小写字母的一个字符串 输出这个字符串的反转字符串 c++ 我写的程序如下:

#include <stdio.h>
#include <string.h>
int main(void)
{
    char str[1000] = {};
    scanf("%s", &str);
    int num = strlen(str);
    for(int i = 0; i < num / 2; i++){
        char mid = str[i];
        str[i] = str[num - i - 1];
        str[num - i - 1] = mid;
        }
    printf("%s", str);
    return 0;
}

问题1:我看题解没有人以这样的思路写,这样写是有什么弊端么?内存什么的? 问题2:如何确保输入字符串必须为全部小写,否则报错,没有查到我想要的程序- -

代码主要有一个绝对的错误,scanf("%s",&str)改为scanf("%s",str);字符串变量不用再取地址了

其它地方没毛病,这样交换方法是比较正常的做法,为什么说别人没这样的思路呢?内存没问题,下标之和为n-1是OK的

对于只接收小写字符的问题,一是在输入时逐个字符接收,遇到非小写字母则输入结束;二是对输入完的str进行扫描,可以另建一个数组,将所有小写字符复制到新数组,然后对新数组进行逆序(当然,继续保留在str也行,不过相对复杂,需要不断移动字符位置并修改字符串大小值)。采用哪种方案,看你的需求确定了。

参考代码: 1、只接收小写字母输入,遇到非小写字母则终止输入,并自动计算出num,不需要strlen(str)计算了

int num = 0;
char c = getchar();
while( c>='a' && c<='z' )  //从控制台流中读取字符,非小写字母则结束输入
{
  str[num++] = c;
  c = getchar();
}

2、对所有输入进行小写字母过滤,并自动计算出num,不需要strlen(str)计算了

char str1[1000] = {0};
int num = 0;
scanf("%s",str1);
for(int k=0;str1[k] != 0; k++)
{
  if(str1[k] >= 'a' && str1[k] <= 'z')
    str[num++] = str1[k];
}