返回的字符串长度小于输入的字符串长度

时间:2019-05-11 13:23:46

标签: c

我正在尝试为agrv中的char设置不同的char值。
例如,执行cmd行:

./programm_name abc

因此argv的长度为3,但是s的长度为1。 我真的不明白为什么:(

#include <stdio.h>
#include <string.h>
#include <ctype.h>

string shift(string s);

int main (int argc, string argv[])
{
  if (argc != 2)
  {
      printf("Usage: ./programm_name keyword\n");
      return 1;
  }
  for(int i = 0; i < strlen(argv[1]); i++)
  {
      if(isdigit(argv[1][i]))
      {
        printf("Usage: ./programm_name keyword\n");
        return 1;
      }
      break;
  }
  string keyword = shift(argv[1]); // here argv[1] length is 3
  return 0;
}

string shift(string s)
{
    for(int i = 0, int n = strlen(s); i < n; i++)
    {
        if(s[i] >= 65 && s[i] <= 90)
        {
            s[i] = s[i] - 65;
        }
        else if(s[i] >= 97 && s[i] <= 122)
        {
            s[i] = s[i] - 97;
        }
        printf("%i\n", s[i]);

    }
    return s; // here s length is 1
}

1 个答案:

答案 0 :(得分:1)

做的时候

   else if(s[i] >= 97 && s[i] <= 122)
   {
       s[i] = s[i] - 97;
   }

,其中 s 为“ abc”,则将“ a”替换为0(然后将“ b”替换为1,将“ c”替换为2),因此第一个字符变为0,字符串的长度变为对于任何以null字符表示字符串结尾的函数,该值为0。

您为什么要进行s[i] = s[i] - 97;或类似的操作?你的目标是什么?

  

return s; //这里的长度是1

否,当输入为“ abc”或“ ABC”时为0


请勿将(ascii)代码用作文字整数,而应使用'a'等

string shift(string s)
{
    for(int i = 0, int n = strlen(s); i < n; i++)
    {
        if(s[i] >= 'A' && s[i] <= 'Z')
        {
            s[i] = s[i] - 'A';
        }
        else if(s[i] >= 'a' && s[i] <= 'z')
        {
            s[i] = s[i] - 'a';
        }
        printf("%i\n", s[i]);

    }
    return s;
}

要知道字符是否为字母,我也建议您使用 isalpha

请注意,您可以执行for(int i = 0, int n = strlen(s); i < n; i++)而不是for(int i = 0; s[i] != 0; i++),而最好使用size_t键入 i 而不是 int ,因为这是索引的类型(这是 strlen 等返回的类型)