在C语言中,为什么不能使用sscanf()修剪字符串?

在C语言中,为什么不能使用sscanf()修剪字符串?,c,string,C,String,因此,如果使用FGET生成字符串,那么按这种方式修剪字符串有什么问题: const int stringMax = 80; char string[ stringMax ]; fgets( string , stringMax , stdin ); // remove trailing <newline> that fgets preserves. len = strlen( string ); if( isspace( string[ le

因此,如果使用FGET生成字符串,那么按这种方式修剪字符串有什么问题:

  const int stringMax = 80;
       char string[ stringMax ];

  fgets( string , stringMax , stdin );

    // remove trailing <newline> that fgets preserves.
  len = strlen( string );
  if( isspace( string[ len-1 ] ) ) {
    string[ len-1 ] = 0;
    len--;
  }

    // let sscanf do the trimming.
  if( len ) sscanf( string , "%s" , string );

  printf( "string \"%s\" len=[%d]\n" , string , len );

仅当输入字符串的开始字母数字和结束字母数字之间没有空格时,此选项才有效


因此,应该考虑trim、trimright和trimleft函数。

这仅在输入字符串的开始字母数字和结束字母数字之间没有空格时才有效

因此,应考虑trim、trimright和trimleft功能

这样修剪绳子有什么问题:

OP的代码有两个问题:

int sscanf(const char * restrict s, const char * restrict format, ...);
源字符串s是限制的。这意味着写地址的副作用。。。不要影响源。由于OP代码中与%s匹配的参数是该字符串,因此无论s的内容如何,结果都是未定义的

即使源和目标的重叠已工作,%s在扫描非空白后,在第一个空白处停止。abd def将成为abc而不是abc def

这样修剪绳子有什么问题:

这有两个问题:

int sscanf(const char * restrict s, const char * restrict format, ...);
isspace是为无符号字符值和EOF指定的。如果字符串[len-1]<0,则结果为UB

可以首先读取导致字符串[-1]的空字符,访问字符串[]缓冲区之外的->更多UB

一些未经测试的修剪代码

这样修剪绳子有什么问题:

OP的代码有两个问题:

int sscanf(const char * restrict s, const char * restrict format, ...);
源字符串s是限制的。这意味着写地址的副作用。。。不要影响源。由于OP代码中与%s匹配的参数是该字符串,因此无论s的内容如何,结果都是未定义的

即使源和目标的重叠已工作,%s在扫描非空白后,在第一个空白处停止。abd def将成为abc而不是abc def

这样修剪绳子有什么问题:

这有两个问题:

int sscanf(const char * restrict s, const char * restrict format, ...);
isspace是为无符号字符值和EOF指定的。如果字符串[len-1]<0,则结果为UB

可以首先读取导致字符串[-1]的空字符,访问字符串[]缓冲区之外的->更多UB

一些未经测试的修剪代码


sscanf字符串,%s,字符串;保持未定义的行为,即使输入字符串的开始字母数字和结束字母数字之间没有空格也是正确的。是的,我通过更好的测试用例发现了这一点。您所说的trim、trimright和trimleft在哪里?sscanf string,%s,string;保持未定义的行为,即使输入字符串的开始字母数字和结束字母数字之间没有空格也是正确的。是的,我通过更好的测试用例发现了这一点。您所说的trim、trimright和trimleft在哪里?char*string[stringMax];声明指针的可变长度数组。。。您需要字符字符串[stringMax];一个可变长度的字符数组。是的,那只是个愚蠢的想法。请参阅下面我的后续回答。char*string[stringMax];声明指针的可变长度数组。。。您需要字符字符串[stringMax];一个可变长度的字符数组。是的,那只是个愚蠢的想法。请看下面我的后续回答。我在更严格的测试中遇到了这两个问题。但是谢谢。我在更严格的测试中遇到了这两个问题。但是谢谢。