轻松程序检查ip - scanf分段故障

时间:2017-05-10 12:27:33

标签: c arrays loops scanf

我已经完成了在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]); 

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

更改行:

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

到:

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

as:

  • 为了将指针传递给&,必须使用符号scanf
  • 您想阅读int s,因此正确的说明符为%d%s用于字符串。