2014-04-27 51 views
2

我想在C中反轉一個字符串,並且遇到了一些定義目標字符串的問題。如何在C中自動定義字符串長度?

這裏是我的想法:(我是初學者,所以我的想法似乎在你的眼裏可笑...)

  1. 我定義未知長度的字符串數據類型,並指定一個字符串它。 (在我的情況下,它STR1)

  2. 我得到串1的字符串長度,並增加該值,並分配給一個整數。 (在我的情況下,+1是爲了補償字符串末尾的'\ 0')

  3. 使用此l整數來定義一個新字符串,它是目標字符串。 (str2在我的情況下)

  4. 使用for循環從str1的末尾複製到str2的開始,並在str2的末尾添加'\ 0'使其成爲一個字符串。

但是,當我嘗試在visual studio 2013中這樣做時,它不讓我編譯。

我已附加了錯誤信息和代碼。 (在錯誤消息中第15行是其中I定義STR2具有整數L)

我試圖只是把一個號碼(例如:100),其中整數L爲的地方,和代碼工作。

你可以讓我知道什麼是錯的定義字符串整型變量,而如何做到這一點,如果有一個在C方式,而不是僅僅定義一個足夠長的刺?

謝謝!

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    /* Reversing a string! */ 

    int l; /* Length of str1 +1 (for the NULL character) */ 

    char str1[] = "This is an unknown length string!"; 
    l = strlen(str1) + 1; 

    char str2[l]; /* The destination string */  
    int i, j; 


    for (i = strlen(str1)-1,j=0; i < strlen(str1) && i >= 0; i--,j++) 
     str2[j] = str1[i]; 
    str2[j] = '\0'; 

    /* Display str1 and str2 */ 

    printf("The content of str1: %s\n", str1); 
    printf("The content of str2: %s\n", str2); 
    return 0; 
} 

enter image description here

回答

1

視覺工作室不支持混合類型聲明和可變長度數組。您需要以C89風格聲明所有變量,即在main的代碼開頭。併爲str2動態分配空間。

size_t l; /* Length of str1 +1 (for the NULL character) */ 
int i, j; 
char str1[] = "This is an unknown length string!"; 
l = strlen(str1) + 1; 

char *str2; 
str2 = malloc(l); 
+1

對於數組長度,使用'size_t'而不是'int'更便於攜帶。 – chux

+1

不要忘記'免費(str2);'這種技術。誠然,在即將退出的計劃中,這並不重要,但最好從一開始就養成良好習慣,並在不再需要時釋放分配的記憶肯定是一種好習慣。 –

1

另一種不需要動態內存分配的方法。它工作在這種情況下,但它不是一般的解決方案(你不能理智地用它來扭轉不同長度的字符串的任意數,例如,而您可以使用malloc()free()來處理)。您的原始代碼使用VLA - 可變長度數組 - 這在C99中是標準的,並且可以在C11中進行選擇性支持。

#include <stdio.h> 

int main(void) 
{ 
    /* Reversing a string! */ 
    char str1[] = "This is an unknown length string!"; 
    char str2[sizeof(str1)]; 
    int len = sizeof(str1); 
    int i, j; 

    for (i = len - 2, j = 0; i >= 0; i--, j++) 
     str2[j] = str1[i]; 
    str2[j] = '\0'; 

    /* Display str1 and str2 */ 
    printf("The content of str1: %s\n", str1); 
    printf("The content of str2: %s\n", str2); 
    return 0; 
}