【问题标题】:Why scanf() always return nothing? [closed]为什么 scanf() 总是什么都不返回? [关闭]
【发布时间】:2015-09-26 18:01:30
【问题描述】:

您好,我需要这方面的帮助:

 int t;
 t = 1;
 char abc[256];
 int main() {
 scanf("%s", abc);
 if(abc == "google") {
  printf("%s \n", abc);
  system("firefox");
 } else
  printf("error");
}

它总是返回错误,请有人帮忙! 我已经尝试过scanf("%c", &abc);,我重写了大约 5 次,结果相同。 我是新手,所以这可能是一件非常愚蠢的事情。

【问题讨论】:

  • 使用strcmp比较字符串兄弟。
  • 不是scanf 问题。这是因为您错误地比较了字符串。

标签: c char scanf


【解决方案1】:
  1. if(abc == "google") {

    这并不像你认为的那样。这将检查指向这两个字符串的 指针 在数值上是否相等。它们永远不会,因为abc 是在堆栈中分配的,而"google" 是字符串文字,因此具有静态存储持续时间。

    您应该使用 strcmp,就像 ameyCU 指出的那样。

  2. 一般情况下,不要像这样使用scanf,如果有人传递了一个大字符串,你写的代码很容易受到缓冲区溢出攻击。

    您可能想看看这篇关于如何安全使用scanf 的好帖子。 How to prevent scanf causing a buffer overflow in C?

【讨论】:

  • 非常感谢这就是问题所在!并感谢您的快速回答!
【解决方案2】:

您无法将两个字符数组的内容== 进行比较。 == 只会比较数组的内存地址(在数组到指针衰减之后)。

改用strcmp

if (strcmp(abc, "google") == 0) ...

【讨论】:

    【解决方案3】:

    常量字符串“google”位于程序的 .rodata 部分,如果编译时出现所有警告 -Wall,则会收到此警告

    google.c:10:12: warning: comparison with string literal results in unspecified behavior [-Waddress]
    if(abc == "google") {
    

    这段代码与

    等价
    const char* const google_str = "google";
    if(abc == google_str)
    

    这里的字符串“google”和该字符串的地址都是常量。所以你看到你在做一个指针比较而不是一个字符串比较。

    printf("%p == %p\n", abc, google_str);
    

    此代码将显示 abc 位于堆栈中,而 google_str 位于 .rodata 部分。字符串比较应该用

    if(0 == strcmp(abc, "google")) {
    

    【讨论】:

      【解决方案4】:
      <code>
      if(abc == "google")
      </code> 
      

      适用于面向对象的语言,如 java 和 dot net 在 c cpp 中,您必须使用 String 的内置库函数,例如 strcpy,strcmp

      <code> int strcmp(const char *str1, const char *str2) <code>
      

      比较 str1 指向的字符串和 str2 指向的字符串。

      所以你将修改你的代码为

        #include <stdio.h>
           int t;
           t = 1;
           char abc[256],a[256];
          int main()
          {
              strcpy(a,"google");
              scanf("%s", abc);
      
              if( strcmp("abc","google")==0 ) {
                  printf("%s \n", abc);
                  printf("firefox");
           } else
            printf("error");
      
              return 0;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多