我的代码出了点问题

时间:2015-11-10 19:48:53

标签: c fault

我正在尝试一些东西,但程序会因此错误而崩溃:分段错误:11 有人有解决方案吗?

char str1[20]

printf("Enter Data: ");
scanf("%s", &str1);


printf("Entered Data: %s\n", str1);
int ex = strtod(str1, sizeof(str1));
printf("%s\n", ex);
if (ex == "1")
{
    printf("1 Detected");
}

..如果提供1,它就不会检测到数字1 ..

3 个答案:

答案 0 :(得分:2)

主要问题在于以下三个方面:

int ex = strtod(str1, sizeof(str1));
printf("%s\n", ex);
if (ex == "1")

首先将字符串转换为double值,然后将其转换为整数。没关系,但如果你想要一个整数值,你可能应该使用strtol

然而,第二和第三行非常有缺陷。在第二行中,您将整数视为指针,即指向字符的指针,a.k.a。字符串。整数值不是指针,将其视为字符串将导致未定义的行为,并且可能在这里你有崩溃。

然后第三行,它在技术上无效,但它永远不会是真的,因为你将整数变量的值与一个字符串的指针进行比较,它们相等的几率很小甚至没有。

为了正确(据我所知)行为尝试这样的事情

int ex;
scanf("%d", &ex);    // Read an integer directly into the variablke
printf("%d\n", ex);  // Print the integer as an integer
if (ex == 1)         // Compare the integer variable to an integer literal
{
    ...
}

答案 1 :(得分:1)

这里有几个问题。

此:

scanf("%s", &str1);

应该是:

scanf("%s", str1);

%s格式说明符需要char *,但您传递char **

然后就是这样:

int ex = strtod(str1, sizeof(str1));

strtod函数需要char **作为第二个参数,这是char *的地址,它将指向第一个无法解析为double的字符。此外,您还要将结果(double)分配给int

您可能希望使用类似的函数strtol来代替解析整数:

int ex = strtol(str1, NULL, 10);

这也是错误的:

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

scanf一样,%s中的printf需要char *,而不是int。请改用%d。这是造成事故的最可能原因。

终于有了这个:

if (ex == "1")

那不是你如何进行整数比较。您反而将ex与字符串常量的地址进行比较。这样做:

if (ex == 1)

答案 2 :(得分:0)

首先,在您的代码中,

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

应该是

printf("%d\n", ex);

然后,exint

if (ex == "1")

应该是

if (ex == 1)