如何将字符串值传递给C中的函数
这让我很烦恼。这给了我一个警告如何将字符串值传递给C中的函数,c,string,C,String,这让我很烦恼。这给了我一个警告 passing argument 1 of ‘funcName’ discards qualifiers from pointer target type 但是,程序运行正常,并打印提交的值 功能如下所示 void funcName(char *str) { printf("%s", str); } void main() { funcName("Hello world"); } 输出是Hello world。这是因为“Hello,world
passing argument 1 of ‘funcName’ discards qualifiers from pointer target type
但是,程序运行正常,并打印提交的值
功能如下所示
void funcName(char *str) {
printf("%s", str);
}
void main() {
funcName("Hello world");
}
输出是Hello world。这是因为“Hello,world”是常量,所以将函数更改为
void funcName(const char *text)
{
printf("%s\n", text);
}
字符串文字是常量,它们存储在程序的只读内存部分,在不使用const
的情况下传递指针意味着您可能会在目标函数中意外修改它,如果这样做,将导致未定义的行为,编译器正试图保护您不受此影响
另外,void main()
不是符合标准的有效签名,您可以在旧书中找到它,在标准之前,但现在它不再被接受,被接受,并且标准签名是
如果不处理命令行参数intmain(void)
处理int main(int argc,char**argv)
中存储在argc
中并在命令行中传递的参数argv
似乎问题是这个C程序被编译成C++程序。 <>在C++字符串中有固定字符数组的类型。因此,如果C++程序中,字符串字符串作为参数提供给具有相应参数的函数,而没有限定符const,编译器将发出一个消息。 如果要将程序编译为C程序,则代码是有效的,因为C字符串中的文字具有非常量字符数组类型,编译器不应发出与限定符相关的诊断消息 无论如何,最好像这样声明函数
void funcName( const char *str );
^^^^^^
因为在这种情况下,函数的用户可以确保传递给函数的字符串不会更改
考虑到不带参数的函数main应以类似C的方式声明
int main( void )
我在GCC4.9中没有收到OP原始代码的警告(带有固定签名的
main()
,并添加了#include
)。至少有一个void main()的警告!如果传递了-std=c99
,我认为应该是一个错误。@DavidBowling事实上这一个错误:“main”的返回类型不是“int”[-Werror=main]
,它直接是一个错误,而不是一个警告。是的,我得到了void main()
的警告,以及缺少的\include
;我的意思是,当我修复它们时,我没有看到丢弃常量的警告。添加-Wwrite strings
标志会触发警告;稍微讨论一下这个问题,有人建议默认情况下g++
启用此警告。但是,我认为将字符串文本作为char*
传递到函数中没有问题,即使修改字符串文本是很困难的。您是如何得到该警告的?请发布编辑行@Sleek 13——您的问题与启用了哪些编译器警告有关。字符串文字不是const
,而是char[]
类型。修改字符串文字是非常困难的,使用GCC标记-Wwrite strings
可启用此警告。您正在使用什么编译器,调用什么?尽管有几个请求,OP并没有提供编译的详细信息。尽管如此,我相信这是正确的答案,你有我的紫外线。您提到的一个重要细节是,C中的字符串不是const
。我确实尝试用g++编译操作代码,但得到了警告:从字符串常量到'char*'[-Wwrite strings]
的不推荐的转换;不完全是OP提到的警告,而是相关的。