删除字符串后的空格(指针)

时间:2011-04-22 18:44:18

标签: c string pointers struct whitespace

我有一个名称,姓氏,地址的结构列表...所有输入都在单独的CHAR字符串中。 问题是每当我粘贴其中一个字符串时,我之后也会得到很多空格。 例如,对于Name和Last name字符串,我得到: 布兰妮............................................约翰逊.... ............................... (点代表每个字符串末尾的空格字符)

这是我的代码:

void table_names (void)
{
ADDRESS *tmp_ptr;
printf ("All names in address book:\n");
tmp_ptr= hol; 
printf(" ______________________________\n");
printf("|  FIRST NAMES   | LAST NAMES  |\n");
printf("|________________|_____________|\n");
while(tmp_ptr!=NULL)
   {   
    printf ("%s%s",tmp_ptr->name,tmp_ptr->lname);
    tmp_ptr= tmp_ptr->next;
   }
}

有关如何摆脱空白的任何帮助?

2 个答案:

答案 0 :(得分:1)

我通过粘贴假设您的意思是显示。

根据这个假设,我还假设每当形成tmp_ptr-> name和tmp_ptr-> lname时,它们的整个缓冲区都用空格填充,并且只有在末尾有一个NUL终结符('\0'

无论在哪里创建,你都需要通过在第一眼看到所有空白时放置'\0'来切断所有额外的空白。可能一种聪明的方法是向后工作以允许名称中的空格。

int i;

for (i = BUFFER_LENGTH - 1; i > -1; --i)
{
    if (value[i] != ' ')
    {
        if (i + 1 != BUFFER_LENGTH)
        {
            value[i + 1] = '\0';
        }
        break;
    }
}

这也可以使用原始指针完成,并假设它通过类似于以下的函数传递:

void rtrim(char *value, const int BUFFER_LENGTH);

答案 1 :(得分:0)

要在没有尾随空格的情况下进行打印,请使用格式.*sstrcspn()

.*sint值作为要打印的char的最大数量。
strcspn(s," ")计算不包含' '的初始前缀的长度。

不需要修改s。如果姓氏中出现空格,则此方法不起作用。

int main(void) {
  const char *s = "Johnson        ";
  printf("'%.*s'\n", (int) strcspn(s, " "), s);
  return 0;
}
  

'约翰逊'

否则它会更加有效。搜索最后' ',如果有的话。

int main(void) {
  const char *s = "Johnson Smith  ";
  size_t len = strlen(s);
  while (len > 0 && s[len-1] == ' ') {
    len--;
  }
  printf("'%.*s'\n", (int) len, s);
  return 0;
}
  “约翰逊史密斯”