C 字符数组定义长度使用变量不工作
C Char Array Define Length Using Variable Not Working
void reverses(char s[])
{
int i, count;
i = count = 0;
// Get the total character count in array
while (s[count] != '[=10=]') ++count;
char copy[count];
仅在直接使用整数时才定义字符数组复制,例如char copy[15];
或char copy[DEFINED];
。
我通过 int count;
向它传递一个整数,它有一个声明值,那么为什么我的数组没有被定义?
复制到这里后我发现我的代码有错误,抱歉。
我正在使用 while 循环来进行反转——将其更改为 for 循环解决了问题。
无论如何,您的许多回答对我很有帮助。所以,谢谢 David Cullen, Vlad from Moscos, R Sahu, user0815, and haccks
Vlad 的回答非常棒,感谢您的启发——我会认真考虑您的回答。
David Cullen 完全按照我的逻辑得出了正确答案!
看来你的编译器不支持变长数组。
考虑到编写反向函数不需要定义辅助数组。函数可以这样写
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;
}
变长数组是C99新增的功能之一。您需要在 GCC 中使用标志 -std=c99
编译您的代码。
您还应注意,如果您使用的是 MSVS,则 MSVS 不支持 VLA。
在 C 的早期版本中,只能在左大括号 '{'
之后立即定义变量
因此将变量定义和 associated/following 代码括在大括号中。
I.E.
{
char copy[count+1];
..... // other associated code that uses the 'copy' variable
}
这段代码产生了预期的输出:
#include <stdio.h>
void reverses(char s[])
{
int i, count;
i = count = 0;
while (s[count] != '[=10=]') ++count;
printf("count = %d\n", count);
char copy[count + 1];
for (i = 0; i < count; i++) {
copy[count - i - 1] = s[i];
}
copy[count] = '[=10=]';
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
在 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
}
尽管如此,您可以在不复制字符串的情况下制作字符串反向器(如果它没有硬编码到字符串 table)...
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 '[=11=]' 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;
}
}
免责声明:我没有编译或 运行 这段代码...但它让我想起了一个旧的家庭作业,所以我觉得试一试很怀旧:)
编辑:编译了这段代码。除非字符串在字符串 table 中被硬编码(将产生总线错误),否则工作完美。如果字符串为空也不会崩溃。
写一个好的测试比编写代码花费的时间更长,但这里的测试和输出显示了有效的动态数据,但硬字符串上有错误:
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
void reverses(char s[])
{
int i, count;
i = count = 0;
// Get the total character count in array
while (s[count] != '[=10=]') ++count;
char copy[count];
仅在直接使用整数时才定义字符数组复制,例如char copy[15];
或char copy[DEFINED];
。
我通过 int count;
向它传递一个整数,它有一个声明值,那么为什么我的数组没有被定义?
复制到这里后我发现我的代码有错误,抱歉。
我正在使用 while 循环来进行反转——将其更改为 for 循环解决了问题。
无论如何,您的许多回答对我很有帮助。所以,谢谢 David Cullen, Vlad from Moscos, R Sahu, user0815, and haccks
Vlad 的回答非常棒,感谢您的启发——我会认真考虑您的回答。 David Cullen 完全按照我的逻辑得出了正确答案!
看来你的编译器不支持变长数组。
考虑到编写反向函数不需要定义辅助数组。函数可以这样写
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;
}
变长数组是C99新增的功能之一。您需要在 GCC 中使用标志 -std=c99
编译您的代码。
您还应注意,如果您使用的是 MSVS,则 MSVS 不支持 VLA。
在 C 的早期版本中,只能在左大括号 '{'
之后立即定义变量因此将变量定义和 associated/following 代码括在大括号中。
I.E.
{
char copy[count+1];
..... // other associated code that uses the 'copy' variable
}
这段代码产生了预期的输出:
#include <stdio.h>
void reverses(char s[])
{
int i, count;
i = count = 0;
while (s[count] != '[=10=]') ++count;
printf("count = %d\n", count);
char copy[count + 1];
for (i = 0; i < count; i++) {
copy[count - i - 1] = s[i];
}
copy[count] = '[=10=]';
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
在 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
}
尽管如此,您可以在不复制字符串的情况下制作字符串反向器(如果它没有硬编码到字符串 table)...
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 '[=11=]' 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;
}
}
免责声明:我没有编译或 运行 这段代码...但它让我想起了一个旧的家庭作业,所以我觉得试一试很怀旧:)
编辑:编译了这段代码。除非字符串在字符串 table 中被硬编码(将产生总线错误),否则工作完美。如果字符串为空也不会崩溃。
写一个好的测试比编写代码花费的时间更长,但这里的测试和输出显示了有效的动态数据,但硬字符串上有错误:
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