C 将字符数组复制到另一个数组中而不复制换行符

C 将字符数组复制到另一个数组中而不复制换行符,c,arrays,printf,fgets,C,Arrays,Printf,Fgets,我使用fgets读取字符数组中的字符串,然后我想将指针移动到5个索引上,并将数组的其余部分复制到一个单独的数组中,但我不希望它复制换行符;所以我有这样的想法: char str1[45], str2[50]; fgets(str2, 50, stdin); *str2 += 5; sprintf(str1, "%[^\n]s", str2); { char line[128]; /*...*/ if (fgets(line, sizeof line, file)) { ch

我使用fgets读取字符数组中的字符串,然后我想将指针移动到5个索引上,并将数组的其余部分复制到一个单独的数组中,但我不希望它复制换行符;所以我有这样的想法:

char str1[45], str2[50];
fgets(str2, 50, stdin);
*str2 += 5;
sprintf(str1, "%[^\n]s", str2);
{
  char line[128];
  /*...*/
  if (fgets(line, sizeof line, file)) {
    char *pnl = strchr(line, '\n'); /* obtain pointer to first newline */
    if (pnl != 0)                   /* if found, overwrite it with null */
      *pnl = 0;
  }
  /*...*/
}
但是当我试图编译时,我得到一个错误,它说:

unknown conversion type character â[â in format [-Wformat]

我很确定我以前在scanf中使用过“%[^\n]s”,效果很好,有什么建议吗?

尝试删除“%[^\n]s”中的最后一个“s”

尝试删除“%[^\n]s”中的最后一个“s”

尝试删除“%[^\n]s”中的最后一个“s”

尝试删除“%[^\n]s”中的最后一个“s”

模式
scanf
的有效格式,但它不是
printf
(或
sprintf
)的有效格式说明符

此外,
*str2+=5
并没有跳过前5个字符(这似乎是有意的),而是为存储在
str2
的第一个元素中的字节添加5<代码>str2=str2+5将不会编译,因为str2是一个数组。您可以将结果分配给临时文件或直接传递给sprintf

以下是一种更好的方法来满足您的要求:

size_t len;
char *str1 = NULL, str2[50];
fgets(str2, 50, stdin);
len = strlen(str2);
if (len > 5) {
  if (str2[len-1] == '\n') {
    str2[len-1] = '\0'; // remove newline
    len--;
  }
  str1 = str2 + 5;
  len -= 5;
}

if (str1 != NULL) {
    // do stuff
}

模式
%[^n]s
scanf
的有效格式,但它不是
printf
(或
sprintf
)的有效格式说明符

此外,
*str2+=5
并没有跳过前5个字符(这似乎是有意的),而是为存储在
str2
的第一个元素中的字节添加5<代码>str2=str2+5将不会编译,因为str2是一个数组。您可以将结果分配给临时文件或直接传递给sprintf

以下是一种更好的方法来满足您的要求:

size_t len;
char *str1 = NULL, str2[50];
fgets(str2, 50, stdin);
len = strlen(str2);
if (len > 5) {
  if (str2[len-1] == '\n') {
    str2[len-1] = '\0'; // remove newline
    len--;
  }
  str1 = str2 + 5;
  len -= 5;
}

if (str1 != NULL) {
    // do stuff
}

模式
%[^n]s
scanf
的有效格式,但它不是
printf
(或
sprintf
)的有效格式说明符

此外,
*str2+=5
并没有跳过前5个字符(这似乎是有意的),而是为存储在
str2
的第一个元素中的字节添加5<代码>str2=str2+5将不会编译,因为str2是一个数组。您可以将结果分配给临时文件或直接传递给sprintf

以下是一种更好的方法来满足您的要求:

size_t len;
char *str1 = NULL, str2[50];
fgets(str2, 50, stdin);
len = strlen(str2);
if (len > 5) {
  if (str2[len-1] == '\n') {
    str2[len-1] = '\0'; // remove newline
    len--;
  }
  str1 = str2 + 5;
  len -= 5;
}

if (str1 != NULL) {
    // do stuff
}

模式
%[^n]s
scanf
的有效格式,但它不是
printf
(或
sprintf
)的有效格式说明符

此外,
*str2+=5
并没有跳过前5个字符(这似乎是有意的),而是为存储在
str2
的第一个元素中的字节添加5<代码>str2=str2+5将不会编译,因为str2是一个数组。您可以将结果分配给临时文件或直接传递给sprintf

以下是一种更好的方法来满足您的要求:

size_t len;
char *str1 = NULL, str2[50];
fgets(str2, 50, stdin);
len = strlen(str2);
if (len > 5) {
  if (str2[len-1] == '\n') {
    str2[len-1] = '\0'; // remove newline
    len--;
  }
  str1 = str2 + 5;
  len -= 5;
}

if (str1 != NULL) {
    // do stuff
}
“%[^\n]s”
适用于
scanf()
,但不适用于
printf()
。注意:当然
“s”
是多余的

有多种方法可以修剪尾部的
\n
。暗示

if (fgets(str2, 50, stdin) == NULL) HAnlde_EOForIOError();
size_t len = strlen(str2);
if (len > 0 && str2[len-1] == '\n') len--;  

if (len < 5) Handle_ShortString();
memcpy(str1, str2 + 5, len-5+1);
if(fgets(str2,50,stdin)=NULL)HAnlde_EOForIOError();
尺寸长度=标准长度(标准长度2);
如果(len>0&&str2[len-1]='\n')len--;
if(len<5)Handle_ShortString();
memcpy(str1、str2+5、len-5+1);
请注意,从
fegts()
返回的字符串并不总是以
'\n'
结尾

请参见
“%[^\n]s”
对于
scanf()
是可以的,但对于
printf()
则不行。注意:当然
“s”
是多余的

有多种方法可以修剪尾部的
\n
。暗示

if (fgets(str2, 50, stdin) == NULL) HAnlde_EOForIOError();
size_t len = strlen(str2);
if (len > 0 && str2[len-1] == '\n') len--;  

if (len < 5) Handle_ShortString();
memcpy(str1, str2 + 5, len-5+1);
if(fgets(str2,50,stdin)=NULL)HAnlde_EOForIOError();
尺寸长度=标准长度(标准长度2);
如果(len>0&&str2[len-1]='\n')len--;
if(len<5)Handle_ShortString();
memcpy(str1、str2+5、len-5+1);
请注意,从
fegts()
返回的字符串并不总是以
'\n'
结尾

请参见
“%[^\n]s”
对于
scanf()
是可以的,但对于
printf()
则不行。注意:当然
“s”
是多余的

有多种方法可以修剪尾部的
\n
。暗示

if (fgets(str2, 50, stdin) == NULL) HAnlde_EOForIOError();
size_t len = strlen(str2);
if (len > 0 && str2[len-1] == '\n') len--;  

if (len < 5) Handle_ShortString();
memcpy(str1, str2 + 5, len-5+1);
if(fgets(str2,50,stdin)=NULL)HAnlde_EOForIOError();
尺寸长度=标准长度(标准长度2);
如果(len>0&&str2[len-1]='\n')len--;
if(len<5)Handle_ShortString();
memcpy(str1、str2+5、len-5+1);
请注意,从
fegts()
返回的字符串并不总是以
'\n'
结尾

请参见
“%[^\n]s”
对于
scanf()
是可以的,但对于
printf()
则不行。注意:当然
“s”
是多余的

有多种方法可以修剪尾部的
\n
。暗示

if (fgets(str2, 50, stdin) == NULL) HAnlde_EOForIOError();
size_t len = strlen(str2);
if (len > 0 && str2[len-1] == '\n') len--;  

if (len < 5) Handle_ShortString();
memcpy(str1, str2 + 5, len-5+1);
if(fgets(str2,50,stdin)=NULL)HAnlde_EOForIOError();
尺寸长度=标准长度(标准长度2);
如果(len>0&&str2[len-1]='\n')len--;
if(len<5)Handle_ShortString();
memcpy(str1、str2+5、len-5+1);
请注意,从
fegts()
返回的字符串并不总是以
'\n'
结尾


请看

我个人,我会用一个简单的for循环从头开始实现它

char str1[45], str2[50];
fgets(str2, 50, stdin);
size_t len = strlen(str2);
for (size_t k = 5; k < len; k += sizeof(char)) {
    str1[k - 5] = str2[k];
}
char str1[45],str2[50];
fgets(str2,50,stdin);
尺寸长度=标准长度(标准长度2);
对于(大小k=5;k
就我个人而言,我会用一个简单的for循环从头开始实现它

char str1[45], str2[50];
fgets(str2, 50, stdin);
size_t len = strlen(str2);
for (size_t k = 5; k < len; k += sizeof(char)) {
    str1[k - 5] = str2[k];
}
char str1[45],str2[50];
fgets(str2,50,stdin);
尺寸长度=标准长度(标准长度2);
对于(大小k=5;k
就我个人而言,我会用一个简单的for循环从头开始实现它

char str1[45], str2[50];
fgets(str2, 50, stdin);
size_t len = strlen(str2);
for (size_t k = 5; k < len; k += sizeof(char)) {
    str1[k - 5] = str2[k];
}
char str1[45],str2[50];
fgets(str2,50,stdin);
尺寸长度=标准长度(标准长度2);
对于(大小k=5;k
就我个人而言,我会用一个简单的fo从头开始实现它