Ваш расчет number1
и number2
приведет к числу, которое может содержать от 1 до 4 цифр. 32-разрядные целые числа обычно могут иметь от 1 до 10 цифр, но поскольку ваша формула применяет модуль 1023, число будет ограничено 1022, или, скорее, 1024, так как вы добавите 2 после этого. Таким образом, он может варьироваться от 2 до 1024. Следовательно, ваши буферыи char n2[1]
недостаточно велики для обработки ваших вызовов до sprintf()
. Для них должно быть не менее 5 символов, что необходимо для (до) 4 цифр, плюс терминал NUL добавлен sprintf()
.
Кроме того, ваша попытка присвоить все и n2
буферам str[0]
и str[1]
неверна; вы не можете назначить char char char. Я также не совсем уверен, почему вы хотите перенести значения из n1
и n2
в другой буфер.
Что вы хотите сделать, это преобразовать обратно в int
после преобразования в строку. Вы можете сделать это следующим образом:
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
struct timeval TempoInicial;
int main() {
int number1, number2;
gettimeofday(&TempoInicial,NULL);
number1 = ((TempoInicial.tv_usec/47) % 1023) + 2;
number2 = ((TempoInicial.tv_usec/47) % 1023) + 2;
char n1[5],n2[5];
sprintf(n1, "%d", number1);
sprintf(n2, "%d", number2);
int i1 = atoi(n1);
int i2 = atoi(n2);
printf("%d %d\n", i1, i2);
}
Вы, кажется, есть некоторая путаница относительно того, что данные могут быть сохранены, в которых типы данных. Символ не может обрабатывать число, которое может превышать 0..1024. Символ 8-бит, поэтому он может содержать только 2^8 == 256 возможных значений. Таким образом, неверно присваивать эти номера str[0]
или str[1]
.
Если вы хотите получить строковое представление чисел, вы уже имеете его в n1
и n2
, любезно предоставлено sprintf()
. Если вы хотите получить интегральное представление чисел, вы уже получили его в number1
и number2
, и вы можете получить его снова из строковых представлений, предоставленных atoi()
, как я покажу в своем коде. Если вы хотите распечатать строковые значения, вы можете сказать что-то вроде printf("%s %s\n", n1, n2);
. Если вы хотите распечатать интегральные значения, вы можете сказать что-то вроде printf("%d %d\n", i1, i2);
, как я покажу в своем коде. Это все действия, которые, как я считаю, имеют отношение к тому, что вы пытаетесь сделать. Дайте мне знать, если у вас возникнут какие-либо вопросы.
А, я думаю, я вижу, что вам нужно. Вы можете объединить n1
и n2
в ту же строку с sprintf()
. Вам просто нужно быть осторожным, чтобы использовать достаточно большой буфер, который будет иметь 4 цифры + 1 пробел + 4 цифры + 1 NUL == 10 как верхний предел или сценарий «наихудшего случая», если хотите.(Сценарий «лучший случай» является 1 цифра + 1 пробел + 1 цифра + 1 NUL == 4) Таким образом, мы имеем:
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
struct timeval TempoInicial;
int main() {
int number1, number2;
gettimeofday(&TempoInicial,NULL);
number1 = ((TempoInicial.tv_usec/47) % 1023) + 2;
number2 = ((TempoInicial.tv_usec/47) % 1023) + 2;
char n1[5],n2[5];
sprintf(n1, "%d", number1);
sprintf(n2, "%d", number2);
char str[10];
sprintf(str, "%s %s", n1, n2);
printf("%s\n", str);
}
возможно дубликат [Как преобразовать число в строку в C] (http://stackoverflow.com/questions/9655202/how-to-convert-integer- to-string-in-c) – Axalo
Нет, это не то же самое, что конверсия. Я уже делаю преобразование в коде –
Я думаю, вам нужно место для нулевого завершения (которое добавляется 'sprintf'), попробуйте сделать' n1' и 'n2' be' n1 [2] 'и' n2 [2] '. – DigitalNinja