Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将字符串值传递给C中的函数_C_String - Fatal编程技术网

如何将字符串值传递给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提到的警告,而是相关的。