2013-12-08 5 views
-1

Я пытаюсь написать функцию, которая сравнивает первые две цифры числа, а так как itoa недоступен, я использую sprintf, как было обнаружено в начале страницы, чтобы сначала преобразовать число в строку и затем сравните каждую цифру. По какой-то странной причине я получаю seg-ошибки, когда я запускаю это. Я пробовал то же самое, но с использованием реальных строк, таких как strncmp («100», «101», 2), и это не дает никаких проблем. Проблема заключается в двух операторах sprintf, которые каким-то образом помещают str2. Я ничего не могу найти, почему это происходит, и что я могу сделать, чтобы исправить это. Провел 2 часа на этом, прежде чем отправлять здесь. Был бы признателен за помощь, если это возможноstrncmp дает ошибку сегментации при сравнении двух строк

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

Edit: Я пытался PRINTF как str1 и str2, и они показывают, 100 и 101 соответственно. Я также пробовал итерацию через массивы символов, но снова получил ошибку. Я действительно смог успешно запустить его, когда создал тестовый файл, и все это началось, поэтому я полностью потерял

Редактировать # 2: Чтобы добавить контекст, эта программа имеет несколько файлов, а некоторые библиотеки включены в другие файлы , Все правильно окружено #ifndef. Вопрос: может ли порядок компиляции файлов произвести эту проблему?

+3

Код, который вы опубликовали, выглядит хорошо и работает правильно для меня. Вы уверены, что это не подходит для вас? Можете ли вы создать [sscce] (http://sscce.org/)? – simonc

+0

Что происходит, когда вы печатаете строки? Можете ли вы использовать отладчик, чтобы определить, какая строка вызывает segfault? –

+0

Я считаю, что входные параметры 'strncmp' должны быть указателями, поэтому вы должны передавать' str1' и 'str2' как' & str1' и '& str2', передавая таким образом его адрес – edwardmp

ответ

0

Не 100% уверен, что я нашел правильное решение, но я считаю, что моя проблема была связана с неправильным make-файлом. В частности, я ранее имел это:

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.

0

Добавить

#include <string.h> 

в верхней части. Процедурные вызовы в современном C могут ошибочно вести себя, если прототип не существует.

+0

Да, это включено. – user3078855

-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 и т. Д.).

Кстати, я didint найти логику в этом сознании, когда вы сравнивая две строки, которые были преобразованы из целого в Чаре, просто вы можете проверить, что два целых числа ...

+0

itoa не является стандартным и, к сожалению, недоступен. Вот ссылка http://stackoverflow.com/questions/190229/where-is-the-itoa-function-in-linux – user3078855