2012-01-22 83 views
1

我必须使用fputs来打印某些内容,而fputs需要使用“const char * str”来打印出来。 我有3个字符串打印(我不关心它是字符串还是字符[])作为str。 我不知道正确的做法。我使用了3个字符串,我将它们添加到一个,但不工作。我也尝试将字符串转换为字符,但没有任何工作! 有什么建议吗?Const char * str问题

struct passwd* user_info = getpwuid(getuid()); 
struct utsname uts; 
uname(&uts); 

我希望我的字符常量*海峡= user_info-> pw_name + '@' + uts.nodename

回答

2

一种可能的解决方案:

/* 1 for '@' and 1 for terminating NULL */ 
int size = strlen(user_info->pw_name) + strlen(uts.nodename) + 2; 
char* s = malloc(size); 

strcpy(s, user_info->pw_name); 
strcat(s, "@"); 
strcat(s, uts.nodename); 


/* Free when done. */ 
free(s); 

编辑:

如果C++您可以使用std::string

std::string s(user_info->pw_name); 
s += "@"; 
s += uts.nodename; 

// s.c_str(); this will return const char* to the string. 
+0

我得到无效*‘到‘字符*’ – BlackM

+0

虽然代码是正确的,[使用strcat'的'是危险的(HTTP“从无效的转换’: //stackoverflow.com/questions/936468/why-does-msvc-consider-stdstrcat-to-be-unsafe-c),应该避免(对于'strcpy'也一样)。 – DarkDust

+1

猜测这是一个C++源代码,所以将'malloc()'的返回值转换为'char *'。如果您使用的是C++,那么建议您使用'std :: string'而不是自己管理内存。 – hmjd

3

您需要为此创建一个新字符串。我不知道为什么你需要fputs限制,但我认为即使你不能/不想使用fprintf,你仍然有snprintf可用。然后你会做这样的:

char *new_str; 
int new_length; 

// Determine how much space we'll need. 
new_length = snprintf(NULL, "%[email protected]%s", user_info->pw_name, uts.nodename); 
if (new_length < 0) { 
    // Handle error here. 
} 
// Need to allocate one more character for the NULL termination. 
new_str = malloc(new_length + 1); 
// Write new string. 
snprintf(new_str, "%[email protected]%s", user_info->pw_name, uts.nodename); 
+0

+1安全.. – hmjd