2015-04-29 2 views
-2

Мне нужно, чтобы строка принимала значения number1 и number2, а затем печатала строку как int, поэтому здесь я конвертирую число 1 и число2 из int в строку и пытаюсь поместить их в str [0] и str [1], но это не работает ... Как я могу это сделать? Я искал в Интернете, но ничего не нашел ... Может кто-нибудь мне помочь?Как заставить строку получить значение 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 str[2]; 
    char n1[1],n2[1]; 
    int i; 

    sprintf(n1, "%d", number1); 
    sprintf(n2, "%d", number2); 

    str[0]=n1; 
    str[1]=n2; 


    int conv = atoi(str); 

    printf("String: %d %d\n",str[0],str[1]); 
} 

Я получаю сообщение:

назначение делает целое число от указателя без приведения [по умолчанию включено] ул [0] = n1;

teste.c: 21: 9: warning: присваивание делает целое число от указателя без литой [включено по умолчанию] str [1] = n2;

+0

возможно дубликат [Как преобразовать число в строку в C] (http://stackoverflow.com/questions/9655202/how-to-convert-integer- to-string-in-c) – Axalo

+0

Нет, это не то же самое, что конверсия. Я уже делаю преобразование в коде –

+0

Я думаю, вам нужно место для нулевого завершения (которое добавляется 'sprintf'), попробуйте сделать' n1' и 'n2' be' n1 [2] 'и' n2 [2] '. – DigitalNinja

ответ

0

Ваш расчет 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); 

} 
+0

Большое вам спасибо! Я понимаю, что вы сказали, и это сработало! Но мне действительно нужно поставить значения n1 и n2 внутри строки str (это активность, которую мой профессор спросил у нас). Но я до сих пор не знаю, как это сделать. N1 и n2 должны быть переданы на str, и я должен напечатать str. Могу ли я все-таки сделать это с помощью инструментов, которые вы мне рассказали? –

+0

@CamilaJ., Смотреть редактирование. – bgoldst

+0

Большое вам спасибо! Я не знал, что sprintf тоже может конкатенировать –

0

Строки C являются массивами символов оканчивающихся нулем. Они должны быть достаточно большими, чтобы содержать все символы, которые представляют нужную строку плюс один байт, чтобы вставить значение 0 (ограничитель строки). Массивы символов n1 и n2 в вашем коде могут иметь размер 5 байт. Char str [] в вашем коде ничего полезного не имеет, тогда я его удалил.

Попробуйте это:

int main() 
{ 
    int number1, number2,conv; 
    char n1[11],n2[11]; 

    gettimeofday(&TempoInicial,NULL); 
    number1 = ((TempoInicial.tv_usec/47) % 1023) + 2; 
    number2 = ((TempoInicial.tv_usec/47) % 1023) + 4; /* +4 to be different from n1!*/ 

    sprintf(n1, "%d", number1); 
    sprintf(n2, "%d", number2); 

    conv = atoi(n1); 
    printf("String: %s %d\n",n1,conv); 
    conv = atoi(n2); 
    printf("String: %s %d\n",n2,conv); 

    return 0; 
} 

Если вам нужно использовать ул в качестве новой строки, отличной от n1 и/или n2 вы должны объявить его как:

char str[11]; 

затем, чтобы скопировать значение n1 в ул, вы должны использовать зЬгср:

strcpy(str,n1); 

Если вы хотите иметь указатели на строки n1 и n2, так что изменение содержания ул [0] изменить n1 и изменения содержимого ул [1] изменить n2, вы должны объявить:

char * str[2]; 

, а затем вы должны присвоить значение n1 и n2 к Силе [0] и ул [1]:

str[0]=n1; 
str[1]=n2; 
Смежные вопросы