2012-10-26 126 views
4

我想要的文件名複製到一個字符串和「.CPT」追加到它。但我無法使用安全函數(strcat_s)執行此操作。錯誤:「字符串不是空的終止!」。我確實設置了'\ 0',如何使用安全函數來解決這個問題?在C字符串添加字符串安全功能

size = strlen(locatie); 
size++; 
nieuw = (char*)malloc(size+4); 
strcpy_s(nieuw, size, locatie); 
nieuw[size] = '\0'; 
strcat_s(nieuw, 4, ".cpt"); // <-- crash 
puts(nieuw); 
+0

怎麼樣'的snprintf()'? – Jack

+0

看來你的用法是不正確的。我還沒有使用這個功能,但按照[文檔】(http://msdn.microsoft.com/en-us/library/d45bbxx4%28v=vs.80%29.aspx)代碼應該'strcat_s(的Nieuw,大小「.CPT」);'在指出[shf301的響應(http://stackoverflow.com/a/13092426/925381) –

回答

7

的_s功能的size參數是目標緩衝區的大小,而不是源。錯誤是因爲nieuw中第一個字符沒有空終止符。試試這個:

size = strlen(locatie); 
size++; 
int nieuwSize = size + 4; 
nieuw = (char*)malloc(nieuwSize); 
strcpy_s(nieuw, nieuwSize, locatie); 
nieuw[size] = '\0'; 
strcat_s(nieuw, nieuwSize, ".cpt"); // <-- crash 
puts(nieuw); 
+1

+1,雖然我有MS功能沒有經驗只是好奇閱讀[strcpy_s的文檔】後(http://msdn.microsoft.com/en-us/library/td1esda9%28v=vs.80%29.aspx) ,不是'nieuw [size] ='\ 0';'多餘? –

+0

是的,它是多餘的。 'strcpy_s'將始終爲null,終止字符串。 – shf301

0

爲什麼不

size = strlen(locatie); 
size++; 
nieuw = (char*)malloc(size+6); 
strcpy_s(nieuw, size, locatie); 
strcat_s(nieuw, 4, ".cpt"); 
puts(nieuw); 
nieuw[size + 5] = '\0'; 
+0

同樣的錯誤,沒有工作。 – para

+0

@Ruben什麼是錯誤? – 2012-10-26 18:33:59

0

退房asprintf。它可以讓你打印一個字符串如printf

+0

asprintf不適用於Windows。 – para

0
size = strlen(locatie); 
size++; 
nieuw = (char*)malloc(size+4); 
strcpy_s(nieuw, size, locatie); 
nieuw[size] = '\0'; 
strcat_s(nieuw, size, ".cpt"); 
puts(nieuw) 

;

0

也許一些標準的解決方案?

const char * const SUFFIX = ".cpt"; 
size = strlen(locatie) + strlen(SUFFIX) + 1; // +1 for NULL 
nieuw = (char*)malloc(size); 
snprintf(nieuw, size, "%s%s", locatie, SUFFIX); 
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char old[] = "hello"; 
    size_t size = strlen(old) + 5;; 
    char *new_name = (char*)malloc(size); 
    new_name[size-1] = '\0'; 
    strcpy_s(new_name, size, old); 
    strcat_s(new_name, size, ".cpp"); 
    printf("%s\n", new_name); 
    return 0; 
}