我正在尝试编写一个比较数字的前两位数的函数,并且由于itoa不可用,我使用的是先前通过googling找到的sprintf,首先将数字转换为字符串,然后比较每个数字。 出于一些奇怪的原因,我在运行时遇到了seg故障。 我尝试了相同的东西,但使用像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正确包围。 问题是文件编译的顺序是否会产生这个问题?
答案 0 :(得分:0)
添加
#include <string.h>
在顶部。如果没有原型在范围内,现代C中的过程调用可能会以各种方式行为不端。
答案 1 :(得分: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并按照上面simonc和Jonathan Leffler的说明缓慢行进。
答案 2 :(得分:-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等等)进行编译。
顺便说一句,当你比较两个已经从整数转换为char的字符串时,我确实在脑海中找到了任何逻辑,只需要检查两个整数......