2017-09-01 93 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--; 
    } 
} 
相關問題