我有一个名称,姓氏,地址的结构列表...所有输入都在单独的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;
}
}
有关如何摆脱空白的任何帮助?
答案 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)
要在没有尾随空格的情况下进行打印,请使用格式.*s
和strcspn()
。
.*s
将int
值作为要打印的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;
}
“约翰逊史密斯”