2017-09-01 35 views
0

即时尝试反转字符串,但即时通讯运行时出现问题,它表示“下标值既不是数组也不是指向矢量”指向char持有者=输入[一世];有人可以帮助解释给我反转c中的字符串错误下标值既不是数组也不是指针也不是向量

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); 
} 
+3

不要使用K&R(预标准)C函数声明。你省略了'myreverse()'函数中的类型,所以返回类型和参数类型都被假定为'int',并且你不能下标int。它应该是'void myreverse(char * input,char * rev,int len)'或其附近。你不要在代码中使用'rev'参数;那也不好。 –

+1

@JonathanLeffler奖励:试图将隐式'int'与VLA('char string [len]')结合使用,这是一种C99功能。 – melpomene

+0

@melpomene,为什么它是一个“奖金”?两者都是完全合法的。如果你想责怪某事,责备C接受这种宽松的投入。 – zneak

回答

1

参数类型默认为int在C,所以你需要明确指定他们为你的功能,因为他们是字符指针:

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

而且,你的函数应该将其结果写入rev,而不是其局部变量string

+0

你的意思是改变字符串[我] rev [i]? –

+0

@EricVuu:你有更多的工作要做。你根本不需要字符串。您需要将'input'中的每个字符复制到'rev'中的相关位置。你需要确保'rev'中的字符串是空的。这是非常简单的: static void myreverse(const char * input,char * rev,int len) { int j = len - 1; (int i = 0; i <= len; i ++) rev [i] = input [j--]; rev [len] ='\ 0'; }' –

0

你应该先找到一些更新的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; 
} 
+0

为什么额外的工作缓冲区在'rev'中已经存在? –

+0

对于OP来说更加清楚,因为他是初学者 –

+0

OP有正确的算法来反转字符串。我的意思是,我不明白在不需要时如何分配缓冲区可以使事情变得更简单和更清晰。 –

1

您的代码几乎是罚款。但myreverse()没有做任何有用的事情,因为它颠倒了一个本地(未初始化)的字符串。可能是你的一个疏忽。

我不太同意你在main中分配反转字符串的方式。使用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--; 
    } 
} 
相关问题