【问题标题】:easy program checking ip - scanf segmentation fault简单的程序检查 ip - scanf 分段错误
【发布时间】:2017-05-10 12:27:32
【问题描述】:

我有任务在 c 中制作简单的程序来检查 IP 地址的类别。我的问题是我不是在 c 中工作,而且我不知道我的程序出了什么问题,因为我没有任何 IDE,并且所有东西都在我的 Debian 上编译。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int ip[4];
    int i=0;

    printf("Enter IP address: ");

    for(i=0;i<4;i++) {
        printf("%d: ",i);
        scanf("%s",ip[i]);
    }

    printf("Your IP address: %03d.%03d.%03d.%03d\n",ip[0],ip[1],ip[2],ip[3]);

    if(ip[0]>=0 && ip[0]<=127){
        printf("This is class A IP address\n");
        printf("Network address: %03d.0.0.0",ip[0]);
    }
    if(ip[0]>127 && ip[0]<=191){
        printf("This is class B IP address\n");
        printf("Network address: %03d.%03d.0.0",ip[0],ip[1]);
    }
    if(ip[0]>191 && ip[0]<224){
        printf("This is class C IP address\n");
        printf("Network address: %03d.%03d.%03d.0",ip[0],ip[1],ip[2]);
    }

    return 1;
    }

当我有这段代码时,有分段错误,当我在第 18 行时,我做了

scanf("%s",&ip[i]); 

我没有任何错误,但我的数字是随机的。

【问题讨论】:

  • scanf("%s",&amp;ip[i]); 更改为 scanf("%d",&amp;ip[i]); 。 ip 是 int 数组,ip[i] 是 int 类型。 "%s" 用于读取字符串/字符数组,而 %d 用于 int
  • 我不知道 beetwen %s 和 %d 有什么区别,我认为这个论点不能重复......谢谢

标签: c arrays loops scanf


【解决方案1】:

换行:

scanf("%s",ip[i]);

到:

scanf("%d", &ip[i]);   //%d instead of %s

作为:

  • 符号&amp; 是必需的,以便将指针 传递给scanf
  • 您想阅读ints,所以正确的说明符是%d%s 用于字符串。

【讨论】:

    【解决方案2】:

    scanf 需要一个指向存储结果的内存的指针。您没有传递指针。你传递一个数组值。

    除此之外,您还尝试将字符串(又名 %s)扫描到整数变量中。要扫描整数,请使用%d

    所以改变

    scanf("%s",ip[i]);
    

    scanf("%d", &ip[i]);
    

    最后,您应该始终检查scanf 返回的值,以确保您获得正确数量的项目,即

    if (scanf("%d", &ip[i]) != 1)
    {
       // Illegal input.
       // Add error handling, e.g. just terminate
       exit(1);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      相关资源
      最近更新 更多