这个语法正确吗? [复制]

Posted

技术标签:

【中文标题】这个语法正确吗? [复制]【英文标题】:Is this syntax correct? [duplicate] 【发布时间】:2019-09-19 07:49:03 【问题描述】:

最近几天我一直在使用 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 而不是另一个。还有一次我输入的一些代码说它只能在 C99 中工作。

现在,当我在 Codeblocks 中运行此代码时,它会崩溃,但不会在 Coderbyte 上。

我的问题是:

1) C 有不同的版本吗?

2)这段代码是否仍然正确,或者函数参数使用char *会更好

我还是 C 新手

【问题讨论】:

Never use gets()! gets 需要一个字符串缓冲区,它也不接受流,只有fgets 接受文件流。 !) 是的,当然。 2)getsexpects a different argument. 你需要它是char new_string[length + 1];。否则,你用strcpy在缓冲区末尾写一个。 是不是很难看出get得到了另一个类型参数?简单的谷歌“得到”立即给出答案。 【参考方案1】:

1) C 有不同的版本吗?

是的,这段代码的有效性因 C 标准而异的具体原因是您使用的是函数 gets,该函数已被现代 C 标准弃用,后来完全删除。实际上没有办法在生产代码中使用gets 而不冒缓冲区溢出的风险,因此建议使用检查缓冲区长度的函数。 fgets 最常见的是:

fgets(buffer, BUFFER_SIZE, stdin);

2) 这段代码是否仍然正确,或者使用 char * 作为函数参数会更好

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

【讨论】:

我想说一个不值得回答的问题。 OP 没有费心去查看函数原型以查看它需要什么参数。顺便说一句,在这个 C 知识级别上,代码的安全性是次要的——对于生产代码来说还为时过早【参考方案2】:

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

length = strlen(str);

char new_string[length];

无法在编译时确定长度值。如果要在运行时控制大小,则必须在 C 中使用 ma​​llocnew 运算符 (C++)。

见Static array vs. dynamic array in C++

【讨论】:

C99 支持 VLA。 除了 van 的评论,这是 C,所以会使用 malloc,而不是新的

以上是关于这个语法正确吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 HTML 属性中调用带有字符串参数的函数的正确语法是啥? [复制]

有人可以解释我如何像我五岁那样进行 JSONP 调用吗? [复制]

在这两个 SQL 查询之间,其中一个是“正确的”吗? [复制]

正确的 html5 布尔属性语法? [复制]

这是在Java中将字符转换为字符串的正确方法吗? [复制]

我该如何解决这个错误,SQLSTATE [42000]? [复制]