2016-06-03 3 views
-6

по какой-то причине sprintf печатает имя моего массива char, содержимое которого я хочу добавить в строку, делая результат бесполезным. Он выглядит хорошо, и он должен работать, только это не так. Вот что у меня есть:C - имя переменной печати sprintf

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

#define STR "ST%d" 
#define MAX_MSG 80 

char name[MAX_MSG+1] ; 


int main(int argc, char **argv) { 
printf("Before: %s\n",name); //--debug 
    sprintf(name,STR,1); //format by 1 
    printf("After: %s\n",name); 
} 

Это тогда дает мне:

Before: name 
After: nameST1 

от мало я знаю, что это должно дать мне

Before: 
After: ST1 

Пожалуйста, помогите.

+1

Пожалуйста, пост [Minimal, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). –

+2

[Проблема не в этом примере кода.] (Http://ideone.com/jvLhkv) – user694733

ответ

3

Ваш первый printf вызывает Undefined Behavior, потому что вы не создали свой буфер.

Вы можете сделать:

chat name[50] = {0}; 

Или с помощью memset сбросить весь массив:

memset (name, 0x00, sizeof(name)); 

О втором printf Я полагаю, вы не сможете разместить свой реальный код. Таким образом, сообщение из-за опубликованного кода не может привести к nameST1 как второе printf

+0

У меня все же есть те же результаты с этим –

+4

@i_use_the_internet. Тогда вы не опубликовали свой настоящий код. – interjay

+0

Я редактировал: разместил код. Опубликованный не может печатать имяST1 – LPs

2

char name[] может содержать значения мусора. Либо используйте memset, либо инициализируйте, как показано.

char name[50]; 
memset(name, 0, sizeof(name)); 

или использовать

char name[50] = {0}; 
+2

Нет, это не «выполнит работу». Он будет работать некорректно во второй раз, когда вы вызовете функцию, а также сделайте код небезопасным. – interjay

+0

@Jite Если массив был глобальным, он был уже обнулен, из-за bss. Так что я считаю, что объявить его как static не влияет на значения массива. – LPs

+0

@LPs Если это глобальный или локальный статический не имеет значения, как вы говорите. Однако вы специально писали, что «локальный статический не выделен bss», что неверно :) – Jite

Смежные вопросы