Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在字符串中获取子字符串并将其存储在另一个字符串中_C_String_Variables_Command Line Arguments - Fatal编程技术网

C 如何在字符串中获取子字符串并将其存储在另一个字符串中

C 如何在字符串中获取子字符串并将其存储在另一个字符串中,c,string,variables,command-line-arguments,C,String,Variables,Command Line Arguments,我有两个相等的字符串,我需要删除其中一个字符串的一部分,并将其存储在另一个字符串中 我的代码不起作用: int main(int argc, char *argv[]) { char *imagetmp = argv[1]; char *imagefile = imagetmp; char *unpackdir = imagetmp; // Remove substring from char imagefile char * pch; pch

我有两个相等的字符串,我需要删除其中一个字符串的一部分,并将其存储在另一个字符串中

我的代码不起作用:

int main(int argc, char *argv[])
{
    char *imagetmp = argv[1];
    char *imagefile = imagetmp;
    char *unpackdir = imagetmp;

    // Remove substring from char imagefile
    char * pch;
    pch = strstr (imagefile,".img");
    strncpy (pch,"",6);

    // Print strings
    puts (imagefile);
    puts (unpackdir);
    return 0;
}
以下是预期输出:

./imgtools mysuperimage.img
mysuperimage.img
mysuperimage
以下是实际输出:

./imgtools mysuperimage.img
mysuperimage
mysuperimage

如何解决此问题?

您需要制作一份
argv[1]
的副本,如果您有两个指向同一字符串的指针,它们自然会打印相同的内容:

int main(int argc, char *argv[])
{
    char imagefile[100];
    if(argc < 2) {
       puts("Too few arguments");
       return 1;
    }

    strncpy(imagefile, argv[1], sizeof(imagefile) - 1);
    //char *unpackdir = argv[1]; you can use argv[1] directly

    // Remove substring from char imagefile
    char * pch;
    if((pch = strstr (argv[1],".img")))
        *pch = 0; //or '\0', just null terminate the string, it's simpler 
    else
        puts("Extension not found");

    // Print strings
    puts (imagefile);
    puts (argv[1]);
    return 0;
}
intmain(intargc,char*argv[])
{
字符图像文件[100];
如果(argc<2){
puts(“参数太少”);
返回1;
}
strncpy(imagefile,argv[1],sizeof(imagefile)-1;
//char*unpacdir=argv[1];您可以直接使用argv[1]
//从char imagefile中删除子字符串
char*pch;
if((pch=strstrstr(argv[1],“.img”))
*pch=0;//或'\0',只需null终止字符串,这样更简单
其他的
看跌期权(“未找到扩展”);
//打印字符串
放置(图像文件);
看跌期权(argv[1]);
返回0;
}

两个指针指向同一个字符串。因此,使用一个指针更改字符串会得到使用另一个指针访问字符串的相同结果。如果需要保留两个单独的字符串,则需要对原始字符串进行copu。@yano,well spotted,thks。如果程序的第一个参数较长,则程序的99个字符会由于缓冲区溢出而进入未定义行为。不好。@alk,是的,你是对的,我也这么想,更正了。除非你检查报税表,否则你不能正确使用strstr。如果在
argv[1]
中没有
“.img”
,那么
pch==NULL
——而
strncpy
应该足够聪明来处理错误,但最好避免。简单地
if((pch=strstrstr(argv[1],“.img”))*pch=0;
可以工作,不需要
strncpy
。(但是
“20200324.img event.img”
的问题仍然存在…)这更好,做得好。可能会解释复制6个空格(或空字符串——无论是哪一个)覆盖扩展可能不是最好的方法,因为您可以通过一个简单的赋值将nul终止于
pch
,然后删除扩展
:)