最近几天,我一直在使用Coderbyte.com来解决C语言中的一些编码难题。我通常使用Codeblocks作为我的IDE,我注意到有时Coderbyte IDE中有效的解决方案会在Codeblocks中引发错误。 例如:
#include <stdio.h>
#include <string.h>
void AlphabetSoup(char str[]) {
int i, j, length;
length = strlen(str);
char new_string[length];
char temp;
strcpy(new_string, str);
for (i = 0; i < length; i++) {
for (j = i + 1; j < length; j++) {
if (new_string[i] > new_string[j]) {
temp = new_string[i];
new_string[i] = new_string[j];
new_string[j] = temp;
}
}
}
// code goes here
printf("%s", new_string);
}
int main(void) {
AlphabetSoup(gets(stdin));
return 0;
}
在代码块中,它在main
函数中抛出错误:
warning: passing argument 1 of 'gets' from incompatible pointer type [enabled by default]
无论如何,我不明白为什么这种解决方案只能在一个IDE上运行而不能在另一个IDE上运行。还有一次,我输入的一些代码说它只能在C99中使用。
现在,当我在代码块中运行此代码时,它会崩溃,但不会在Coderbyte上崩溃。
我的问题是:
1)是否有不同版本的C?
2)此代码是否仍然正确,还是将char *
用作函数参数
我还是C的新手
答案 0 :(得分:4)
1)是否有不同版本的C?
是的,该代码的有效性在C标准之间不同的特定原因是您正在使用函数gets
,该功能已不推荐使用,后来被现代C标准完全删除。几乎没有办法在生产代码中使用gets
而不冒缓冲区溢出的风险,因此建议使用检查缓冲区长度的函数。 fgets
最常见于:
fgets(buffer, BUFFER_SIZE, stdin);
2)此代码是否仍然正确,或者将char *用作函数参数会更好
函数参数char *foo
和char foo[]
之间没有区别,因为当数组作为函数的参数传递时,它会衰减到指向其第一个元素的指针。两种语法都可以接受。
答案 1 :(得分:-2)
此语法不正确,因为c / c ++中的数组声明在编译时必须具有恒定的大小。
length = strlen(str);
char new_string[length];
长度值不能在编译时确定。如果要在运行时控制大小,则必须在C中使用 malloc 或 new 运算符(C ++)。