-1

我正在尝试编写一个比较数字的前两位数字的函数,并且由于 itoa 不可用,因此我使用 sprintf 之前通过谷歌搜索找到的首先将数字转换为字符串,然后比较每个数字。出于某种奇怪的原因,我在运行它时遇到了段错误。我尝试了同样的事情,但使用了像 strncmp("100", "101", 2) 这样的实际字符串,它没有给出任何问题。问题是由于两个 sprintf 语句以某种方式弄乱了 str2。我找不到任何地方为什么会发生这种情况以及我能做些什么来解决它。在这里张贴之前花了 2 个小时。如果可能的话,将不胜感激

int exists;
int id1 = 100;
int id2 = 101;
char str1[12];
char str2[12];
sprintf(str1, "%d", id1);
sprintf(str2, "%d", id2);
exists = strncmp(str1,str2,2);
printf("Res is %d\n", exists);

编辑:我试过 printf str1 和 str2 ,它们分别显示 100 和 101 。我也尝试通过 char 数组进行迭代,但再次出现 seg 错误。当我创建一个测试文件并且它全部运行时,我实际上能够成功运行它,所以我完全迷失了

编辑#2:要添加上下文,该程序中有多个文件,并且一些库包含在其他文件中。一切都被#ifndef 正确包围。问题是文件编译的顺序会产生这个问题吗?

4

3 回答 3

0

添加

#include <string.h>

在顶部。如果没有原型在范围内,现代 C 中的过程调用可能会以各种方式出现异常。

于 2013-12-08T01:06:30.773 回答
0

不是 100% 确定我找到了正确的解决方案,但我相信我的问题与格式错误的 makefile 有关。具体来说,我以前有这个:

CC = /usr/local/bin/gcc
CFLAGS = -Wall -g
... (omitting file list)
#build exe from .o files
$(PROJECT) : $(OBJS)
    $(CC) $(CFLAGS) $(OBJS) -o $(PROJECT)

在我将 CC 更改为 CC = gcc 后,它开始工作。不过,我之前不得不剥离我的 main.c 并按照上面simoncJonathan Leffler所述缓慢进行。

于 2013-12-08T16:55:42.430 回答
-1

."..并且由于 itoa 不可用,并且由于 itoa 不可用..." 什么...?!你在开玩笑吗?包括 stdlib.h :)

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

void main(void)
{
    int exists, id1 = 100, id2 = 101;
    char str1[12], str2[12];

    sprintf(str1, "%d", id1);
    sprintf(str2, "%d", id2);
    exists = strncmp(str1, str2, 2);

    printf("Res is %d\n", exists);
}

无论如何...当我检查并测试您发布的代码时,一切都好。尝试使用其他软件(GCC、TurboC 等)进行编译。

顺便说一句,当您比较两个已从整数转换为字符的字符串时,我没有发现任何逻辑,您只需检查两个整数...

于 2013-12-08T05:22:27.487 回答