【问题标题】:C: Returning D as output why?C:返回 D 作为输出,为什么?
【发布时间】:2020-04-17 06:30:15
【问题描述】:
#include <stdio.h>

int main(){
    char *s="hello world";
    printf("%c\n",s);
}

我用 C 编写了一个小代码。在这段代码的最后一条语句中,我在 printf() 函数中使用了 %c 格式说明符,并在其中分配了名为 s 的指针。它给了我D 作为输出。它是返回垃圾值还是我的代码自动在其中分配 ASCII 值或其他什么?

当我添加s+1 它返回Es+2 返回F 等等。谁能给我解释一下?

【问题讨论】:

  • 因为字符串是用%s 打印的,正如您最喜欢的初级C 编程书籍的第一章所预言的那样。您的代码调用了未定义的行为错误,这意味着任何事情都可能发生。可能编译器会尝试将 address 的第一个字节作为字符打印到 s
  • 检查数据类型......
  • @Sourav Ghosh 谢谢。

标签: c string pointers


【解决方案1】:

%c 打印char,而不是字符串。由于您的变量s 不是char,而是指向char 的指针,printf 将字符串的地址解释为一个字符。您可能想使用其中一个 sn-ps:

printf("%c\n", s[0]); // print the first character in your string
printf("%s\n", s); // print the whole string

【讨论】:

  • 我认为s[0] 更适合*s 来传达代码的意图
  • 这是一个很好的建议@Ackdari,我会编辑我的答案。谢谢!
【解决方案2】:

关于:

printf("%c\n",s);

编译器输出结果:

*untitled2.c:5:14: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’ *[-Wformat=]*   

编译时,始终启用警告,然后修复这些警告。建议:

printf("%s\n",s);

所以该语句使用正确的“输出格式转换”说明符来输出整个字符串

--或--

输出单个字符建议:

printf( "%c\n", s[0] );

只输出第一个字符h

【讨论】:

    【解决方案3】:

    考虑到你在这段代码中的表现,让我们说,是的,当你在printf() 中提供s/s+1/s+2... 时,你得到了垃圾值。这只是因为您的格式说明符%c(type is char) 与 s(type is string) 不匹配。解决方法是将后者更改为输入char,您的问题将得到解决。

    您无需担心此值的来源,因为归根结底,它是一个垃圾值,并且对于使用代码的不同人来说会有所不同。据我所知,它没有可能的用途。

    试试下面的代码,你的代码就可以正常工作了:

        char *s="hello world";
        printf("%c\n",*s);
    

        char *s="hello world";
        printf("%c\n",s[0]);
    

    这些答案在上面的answers和cmets中都有讨论。但是你也应该试试这个,

        char s[]="hello world";
        printf("%c\n",s[0]);      
    

    因为,尽管 C、swift 等中存在指针。不鼓励他们这样做,因为它们提出了内存安全和垃圾收集的主要问题。


    编辑:Stackoverflow fam 在当前状态下需要一些支持,我什至无法评论。 (除非 我是对的)

    【讨论】:

    • 在 C 中没有类型 Stringchar * 确实是在 C 中声明字符串的正确方式。
    • @Ashish Kumar 谢谢。还有一个问题 String s="hi" 是否可以在 C 中工作。正如您在答案中发布的那样。我需要导入任何库或其他东西才能使用吗C.
    • @MartinFink char array -> 'char name []' 是在 C 中声明字符串的正确方法。看这里geeksforgeeks.org/strings-in-c-2 你可以在这里找到区别geeksforgeeks.org/…
    • @ManinderSingh 我很抱歉......我用java编程,因此在打字时出现了字符串......我试图为你写一个通用答案的任何方式。但我现在为你纠正了。美好的一天
    • @AshishKumar ok.but MartinFink 也是对的。你也可以在 C.char *x="hi"; 中定义这样的字符串。这是在C中定义字符串的最佳方式。其背后的原因是因为没有内存浪费。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2017-12-13
    • 1970-01-01
    相关资源
    最近更新 更多