Возвращаемая длина строки меньше длины входной строки - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь установить различные значения для char в строку из agrv.
Например, выполнить строку 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 Ответ

1 голос
/ 11 мая 2019

при выполнении

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

, где s означает «abc», вы заменяете «a» на 0 (затем «b» на 1 и «c»на 2) поэтому первый символ становится 0, а длина строки становится 0 для любой функции, где нулевой символ указывает на конец строки.

Почему вы делаете s[i] = s[i] - 97; или эквивалентный?Какова ваша цель?

return s;// здесь длина s равна 1

нет, это 0, когда ввод "abc" или "ABC"


Не использовать (ascii) код в качестве литералацелое число, используйте «а» и т. д.

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++), и лучше набрать i с size_t вместо int , потому что это тип для индекса (это тот, который возвращается strlen etc)


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...