这个语法正确吗? [复制]
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 usegets()
!
gets
需要一个字符串缓冲区,它也不接受流,只有fgets
接受文件流。
!) 是的,当然。 2)gets
expects 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 *foo
和 char foo[]
,因为当数组作为参数传递给函数时,它会衰减为指向其第一个元素的指针。两种语法都可以接受。
【讨论】:
我想说一个不值得回答的问题。 OP 没有费心去查看函数原型以查看它需要什么参数。顺便说一句,在这个 C 知识级别上,代码的安全性是次要的——对于生产代码来说还为时过早【参考方案2】:此语法不正确,因为 c/c++ 中的数组声明在编译时必须具有恒定大小。
length = strlen(str);
char new_string[length];
无法在编译时确定长度值。如果要在运行时控制大小,则必须在 C 中使用 malloc 或 new 运算符 (C++)。
见Static array vs. dynamic array in C++
【讨论】:
C99 支持 VLA。 除了 van 的评论,这是 C,所以会使用 malloc,而不是新的以上是关于这个语法正确吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在 HTML 属性中调用带有字符串参数的函数的正确语法是啥? [复制]
有人可以解释我如何像我五岁那样进行 JSONP 调用吗? [复制]