这个语法正确吗?

时间:2019-04-30 15:44:19

标签: c

最近几天,我一直在使用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的新手

2 个答案:

答案 0 :(得分:4)

  

1)是否有不同版本的C?

是的,该代码的有效性在C标准之间不同的特定原因是您正在使用函数gets,该功能已不推荐使用,后来被现代C标准完全删除。几乎没有办法在生产代码中使用gets而不冒缓冲区溢出的风险,因此建议使用检查缓冲区长度的函数。 fgets最常见于:

fgets(buffer, BUFFER_SIZE, stdin);
  

2)此代码是否仍然正确,或者将char *用作函数参数会更好

函数参数char *foochar foo[]之间没有区别,因为当数组作为函数的参数传递时,它会衰减到指向其第一个元素的指针。两种语法都可以接受。

答案 1 :(得分:-2)

此语法不正确,因为c / c ++中的数组声明在编译时必须具有恒定的大小。

length = strlen(str);

char new_string[length];

长度值不能在编译时确定。如果要在运行时控制大小,则必须在C中使用 malloc new 运算符(C ++)。

请参见Static array vs. dynamic array in C++