C字符数组使用变量不工作定义长度

时间:2015-03-27 21:17:35

标签: c arrays char

void reverses(char s[])
{
    int i, count;
    i = count = 0;

    // Get the total character count in array
    while (s[count] != '\0') ++count;

    char copy[count];

仅在直接使用整数时定义字符数组副本,例如char copy[15];char copy[DEFINED];

我通过int count;传递一个整数,它有一个声明的值,所以为什么不定义我的数组呢?

我在我的代码中发现了一个错误,这是在这里复制的,抱歉。

我正在使用while循环来进行反转 - 将其更改为for循环可以解决问题。

无论如何,你的许多答案对我都很有帮助。所以,谢谢 David CullenVlad from MoscosR Sahuuser0815haccks

弗拉德的回答太棒了,谢谢你的启发 - 我会考虑你的答案。 David Cullen完全遵循我的逻辑并得到了正确答案!

5 个答案:

答案 0 :(得分:2)

您的编译器似乎不支持可变长度数组。

考虑到要编写反向函数,不需要定义辅助数组。该功能可以按以下方式编写

char * reverse( char s[] )
{
    size_t i = 0, n = 0;

    while ( s[n] ) ++n;

    for ( ; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n-i-1];
        s[n-i-1] = c;
    }

    return s;
}

答案 1 :(得分:2)

此代码产生了预期的输出:

#include <stdio.h>

void reverses(char s[])
{
    int i, count;
    i = count = 0;

    while (s[count] != '\0') ++count;

    printf("count = %d\n", count);

    char copy[count + 1];

    for (i = 0; i < count; i++) {
        copy[count - i - 1] = s[i];
    }
    copy[count] = '\0';

    printf("copy = %s\n", copy);
}

int main(void)
{
    reverses("string");
}

输出:

count = 6
copy = gnirts

这是在OS X上用gcc测试的:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

答案 2 :(得分:0)

可变长度数组是添加到C99的功能之一。您需要在GCC中使用标记-std=c99编译代码。

您还应注意,如果您使用的是MSVS,则MSVS不支持VLA。

答案 3 :(得分:0)

在C中实现可变长度数组的正确方法是使用malloc。

#include <stdlib.h>

void makeArrayOfSize(int size) {
   // Create memory for array
   char *chars = (char *)malloc(size * sizeof(char));

   // Do business logic

   free(chars); // ALWAYS free pointers to allocated memory to avoid leaks
}

虽然,您可以在不复制字符串的情况下制作字符串反转器(如果它没有硬编码到字符串表中)...

void reverse(char* string) {
   int length = 0;
   int index = 0;
   char temp;

   // Ensure string is not null
   if (!string) {
      return;
   }

   // Get length assuming string has proper '\0' char at the end
   while (string[length]) {
      ++length;
   }

   // Play catch!
   while (index < length / 2) {
      temp = string[index++];
      string[index - 1] = string[length - index];
      string[length - index] = temp;
   }
}

免责声明:我没有编译或运行此代码......但它让我想起了一个旧的家庭作业,所以我觉得它很难以试一试:)

编辑:编译此代码。除非字符串在字符串表中被硬编码(否则会产生总线错误),否则可以正常工作。如果字符串为空,也不会崩溃。

花费更长的时间来编写一个比代码更好的测试,但这里是测试和输出显示工作动态数据,但是硬字符串上有错误:

int main(int argc, char** arcv) {
   char *string;
   char string0[0];
   char string1[1];
   char string2[2];
   char string3[3];
   char string4[4];
   char string5[5];
   char string6[6];
   char *string7 = "abcdef";

   string2[0] = 'a';

   string3[0] = 'a';
   string3[1] = 'b';

   string4[0] = 'a';
   string4[1] = 'b';
   string4[2] = 'c';

   string5[0] = 'a';
   string5[1] = 'b';
   string5[2] = 'c';
   string5[3] = 'd';

   string6[0] = 'a';
   string6[1] = 'b';
   string6[2] = 'c';
   string6[3] = 'd';
   string6[4] = 'e';

   printf("String: %s\n", string);
   reverse(string);
   printf("Reverse String: %s\n", string);

   printf("String0: %s\n", string0);
   reverse(string0);
   printf("Reverse String0: %s\n", string0);

   printf("String1: %s\n", string1);
   reverse(string1);
   printf("Reverse String1: %s\n", string1);

   printf("String2: %s\n", string2);
   reverse(string2);
   printf("Reverse String2: %s\n", string2);

   printf("String3: %s\n", string3);
   reverse(string3);
   printf("Reverse String3: %s\n", string3);

   printf("String4: %s\n", string4);
   reverse(string4);
   printf("Reverse String4: %s\n", string4);

   printf("String5: %s\n", string5);
   reverse(string5);
   printf("Reverse String5: %s\n", string5);

   printf("String6: %s\n", string6);
   reverse(string6);
   printf("Reverse String6: %s\n", string6);

   printf("String7: %s\n", string7);
   printf("(error after this)\n");
   reverse(string7);
   printf("Reverse String7: %s\n", string7);

   return 0;
}

输出:

String: (null)
Reverse String: (null)
String0: 
Reverse String0: 
String1: 
Reverse String1: 
String2: a
Reverse String2: a
String3: ab
Reverse String3: ba
String4: abc
Reverse String4: cba
String5: abcd
Reverse String5: dcba
String6: abcde
Reverse String6: edcba
String7: abcdef
(error after this)
Bus error: 10

答案 4 :(得分:-1)

在早期版本的C中,变量只能在打开大括号'{'

后立即定义

将变量定义和关联/后续代码括在大括号中。

{
    char copy[count+1];
    ..... // other associated code that uses the 'copy' variable
}