为什么scanf()总是什么都不返回?

时间:2015-09-26 18:01:31

标签: c char scanf

我需要帮助:

 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次。 我对此很陌生,所以这可能是一个非常愚蠢的事情。

4 个答案:

答案 0 :(得分:4)

  1. if(abc == "google") {

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

    你应该像ameyCU指出的那样使用strcmp

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

    您可能希望查看有关如何安全使用scanf的好文章。 How to prevent scanf causing a buffer overflow in C?

答案 1 :(得分:3)

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

改为使用strcmp

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

答案 2 :(得分:1)

常量字符串“google”驻留在程序的.rodata部分中,如果您使用所有警告进行编译,则会收到此警告

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")) {

答案 3 :(得分:0)

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

可用于面向对象的语言,如java和dot net 在c cpp中你必须使用String的inbuild库函数,如strcpy,strcmp

  #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;
    }

将str1指向的字符串与str2指向的字符串进行比较。

因此,您将修改代码

{{1}}