在C中连接字符串和数字

Concatenating a string and numbers in C

我有一个程序必须计算字符串中重复字符的数量。例如“aaabcc”应该return“a3b1c2”和“aaabcccc..a”应该return“a3b1c4.2a1”。我目前正在使用 sprintf 像这样连接字符串和数字:sprintf(s, "%s%c%d", s, prev, count);,其中 s 是包含结果的字符串。但这会导致错误,因为我使用“s”作为输入和目标。有解决办法吗?

这是我现在的代码:

    char *s = (char *)malloc(sizeof(char) * 100);
    char prev = argv[1][0];
    if(isdigit(prev)!=0){
        printf("%s","ERROR");
        return 0;
    }
    
    int count = 1;
    for(int i=1; i<strlen(argv[1]); i++){
        if(isdigit(argv[1][i])!=0){
            printf("%s","ERROR");
            return 0;
        }
        
        //check if same as previous letter
        if(prev==argv[1][i]){
            count++;
        }else{
           //add letter and count to string
            //problem
            sprintf(s, "%s%c%d", s, prev, count);
            
            count = 1;
        }
        
        //update prev
        prev=argv[1][i];
    }
    
    //add it to string
    //problem
    sprintf(s, "%s%c%d", s, prev, count);
    
    //check if result is smaller than input
    if(strlen(s) > strlen(argv[1])){
        printf("%s\n", argv[1]);
    }else{
        printf("%s\n", s);
    }
    free(s);

sprintf() 使用不同的缓冲区,然后使用 strcat() 连接到 s

确保在分配后将 s 初始化为空字符串。

不是为 s 分配硬编码大小,而是分配一个足够大的字符串以应对最坏的情况(每个字符只重复一次,所以它是 a1b1c1...)。

temp 可以是一个固定大小的短字符串,因为它只需要保持一个 运行.

的长度
char *s = malloc(strlen(argv[1]) * 2 + 1);
s[0] = '[=10=]';
char temp[20];
char prev = argv[1][0];
if(isdigit(prev)!=0){
    printf("%s","ERROR");
    return 0;
}
    
int count = 1;
for(int i=1; i<strlen(argv[1]); i++){
    if(isdigit(argv[1][i])!=0){
        printf("%s","ERROR");
        return 0;
    }
        
    //check if same as previous letter
    if(prev==argv[1][i]){
        count++;
    }else{
        //add letter and count to string
        sprintf(temp, "%c%d", prev, count);
        strcat(s, temp);
            
        count = 1;
    }
        
    //update prev
    prev=argv[1][i];
}
    
//add it to string
sprintf(temp, "%s%c%d", prev, count);
strcat(s, temp);
    
//check if result is smaller than input
if(strlen(s) > strlen(argv[1])){
    printf("%s\n", argv[1]);
}else{
    printf("%s\n", s);
}
free(s);

评论和其他答案中的建议为您提供了有关如何管理使用 malloc 动态分配的字符串的良好指导。但是您可以简化整个程序,而无需分配字符串,也无需使用 sprintf。

考虑一下:

int lastChar = '[=10=]';
int count = 0;
const char* arg = argv[1];
int isError = 0;

if (argc < 2) {
    isError = 1;
}

while (*arg & !isError) {     // scan argv[1] for digits
    isError = isdigit(*arg);
    arg++;
}
arg = argv[1];                // reset arg back to beginning of argv[1]

while (*arg && !isError) { 
    if (lastChar == *arg) {
        count++;
    }
    else {
        if (count > 0) {
            printf("%c%d", lastChar, count);
        }
        lastChar = *arg;
        count = 1;
    }
    arg++;
}

// print the last character being tracked or error message
if (isError) {
    printf("ERROR");
}
else if (count > 0) {
    printf("%c%d", lastChar, count);
}
printf("\n");