错误:将参数 1 传递给带有参数 3 的限制限定参数别名 [-Werror=restrict]

3 c printf pointers dynamic-memory-allocation

当我手动测试我的程序时,它可以编译并正常工作,但是当我尝试在终端中使用自动评分器时,我收到此错误。我是 C 新手,不明白它的含义以及如何修复它。

我的代码:

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, char* argv[]){
    
    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;
        }
        if(prev==argv[1][i]){
            count++;
        }else{
            sprintf(s, "%s%c%d", s, prev, count);
            count = 1;
        }
        prev=argv[1][i];
    }
    sprintf(s, "%s%c%d", s, prev, count);
    if(strlen(s) > strlen(argv[1])){
        printf("%s\n", argv[1]);
    }else{
        printf("%s\n", s);
    }
    free(s);
      
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*dge 5

不允许您将字符串 sprintf 到自身。也就是说,您不能将字符串s作为源参数之一传递给sprintfwhens也是目标。

例如,请参见注释下的cppreference :

C 标准和 POSIX 指定,当参数与目标缓冲区重叠时,sprintf 及其变体的行为是未定义的。例子:

    sprintf(dst, "%s and %s", dst, t); // <- broken: undefined behavior
Run Code Online (Sandbox Code Playgroud)

您需要想出一种不同的方法将所需的字符和数字连接在一起。