【问题标题】:reverse a string in c error subscripted value is neither array nor pointer nor vector反转c中的字符串错误下标值既不是数组也不是指针也不是向量
【发布时间】:2017-09-01 23:06:17
【问题描述】:

我试图反转一个字符串,但我遇到了一个问题,它说“下标值既不是数组也不是指针也不是向量”指向 char holder = input[i];有人可以帮我解释一下吗

myreverse(input, rev, len)
{
  int i = 0;
  int j= len -1;
  char string[len];

  while(i<j)
  {
      char holder = input[i];
      string[i]= string[j];
      string[j] = holder;
      i++;
      j--;
  }
}


int main(int argc, char* argv[]) {
  if (argc < 2) {
    printf("Usage: %s <word to reverse>\n", argv[0]);
    exit(1);
  }
  char* input = argv[1];
  int len = strlen(input);
  char rev[len + 1]; // Adding one for the null terminator
  myreverse(input, rev, len);
  printf("Rev string is %s\n", rev);
}

【问题讨论】:

  • 不要使用 K&R(准标准)C 函数声明。你省略了myreverse()函数中的类型,所以返回类型和参数类型都假定为int,你不能下标int。它应该是void myreverse(char *input, char *rev, int len) 或附近。您不要在代码中使用rev 参数;这也很糟糕。
  • @JonathanLeffler 奖励:尝试将隐式 int 与 VLA (char string[len]) 结合使用,这是 C99 功能。
  • @melpomene,为什么是“奖金”?两者都是完全合法的。如果你要责备某些事情,那就责怪 C 接受这种松懈的输入。
  • @zneak 不在一起。 C99 添加了 VLA,但从语言中删除了隐含的 int
  • 我相信the point stands 认为,如果有人要责备,那不是新开发人员试图找出 45 年的包袱。

标签: c


【解决方案1】:

参数类型在 C 中默认为 int,因此您需要为您的函数显式指定它们,因为它们是字符指针:

void myreverse(const char* input, char* rev, int len)

此外,您的函数应将其结果写入rev,而不是其局部变量string

【讨论】:

  • 你的意思是把string[i]改成rev[i]?
  • @EricVuu:你还有更多的工作要做。你根本不需要string。您确实需要将input 中的每个字符复制到rev 中的相关位置。您需要确保rev 中的字符串以空值结尾。这一切都很简单:static void myreverse(const char *input, char *rev, int len) { int j = len - 1; for (int i = 0; i &lt;= len; i++) rev[i] = input[j--]; rev[len] = '\0'; }
【解决方案2】:

您的代码几乎没问题。但是 myreverse() 没有做任何有用的事情,因为它反转了本地(未初始化的)字符串。可能是您的疏忽。

我不太同意你在 main.js 中分配反转字符串的方式。使用 strdup(),然后释放内存会更好,更便携。但是如果你的编译器允许的话......

为什么不原地反转字符串呢?

你应该考虑这个:

void myreverse(char* s)
{
  int j;
  int i = 0;
  if (s == NULL)
      return;

  j = strlen(s) - 1;
  while(i < j)
  {
      char t = s[i];
      s[i]= s[j];
      s[j] = t;
      i++;
      j--;
  }
}

【讨论】:

    【解决方案3】:

    您应该首先找到更多最新的 C 书籍。该函数定义来自 K&R 时代。在这里,您有反向字符串功能。您确实需要提供大小,因为所有 C 字符串都以零结尾

    char *reverse(char *str)
    {
        char tmp;
        int len;
    
        if (str != NULL)
        {
            len = strlen(str);
            for (int i = 0; i < len / 2; i++)
            {
                tmp = *(str + i);
                *(str + i) = *(str + len - i - 1);
                *(str + len - i - 1) = tmp;
    
            }
        }
        return str;
    }
    

    或者其他版本

    char *reversendup(consr char *srcstr, char *rev, size_t bufsize)
    {
        int len;
        char *wrk;
    
        if (str != NULL)
        {
            len = strlen(str);
            if ((wrk = calloc(sizeof(char), len + 1)) != NULL)
            {
                for (int i = 0; i < len; i++)
                {
                    *(wrk + i) = *(srcstr + len - i - 1);
                }
                strncpy(rev, wrk, bufsize);
                free(wrk);
            }
        }
        return rev;
    }
    

    【讨论】:

    • rev 中已经有一个可用的工作缓冲区时,为什么还要额外的工作缓冲区?
    • OP 有正确的算法来反转字符串。我的意思是,我看不到在不需要时分配缓冲区如何使事情变得更简单和更清晰。
    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多