2009-09-21 23 views
0

时:回到在下面的代码段打印新的字符

....... 
mystring ID; 
char dum[]="_";   
fprintf(fp_file,"%s%s%d ",ID,dum,1); 
..... 

ID就像是"customers "

一个字符串,所以我得到的输出:

"customers _1" 

但我的本意是得到

"customers_1" 

由于技术原因,我不能以任何方式修改ID,所以我想知道,在程序打印dum时,它是否可以将字符放回,覆盖组成ID的一部分的空白区域,以便得到我想要的结果。

非常感谢

回答

6

你可以绑定的字符串大小是这样的:

fprintf(fp_file,"%.*s%s%d ",strlen(ID)-1, ID, dum, 1); 
+0

这里可能是最有效的答案,包括我的。 – 2009-09-21 18:14:01

1

为什么不直接通过您的ID字符串循环,直到你找到空间,并打印每个字符除了的空间。试试这个:

void print_id(FILE *file, const char *id, char delim, int num) 
{ 
    while(*id && *id != ' ') fputc(*id++, file); 
    fprintf(file, "%c%d\n", delim, num); 
} 

你可以使用strchr()找到空间和计算出你想印有该ID的长度,因为printf()%s符可以用来打印一个字符串中的一部分,但你会在字符串上循环两次。这样我们只做一次。用法:

print_id(ID, '_', 1); 

更新:如果你需要的所有字符,但最后一个,Nick D's answer是要走的路。它使用*printf()函数系列中较为深奥的功能之一告诉printf()只能打印到最后一个字符。有一种方法可以通过循环和fputc()来实现,但是效率上的小差异并不值得为编写它以及如何记录它而烦恼,以便继任者能够理解你在做什么。因为你正在记录它,对吗? :P

+0

的另一个问题是,ID可以包含另一个空间,所以它可能是例如:“客户名单” – flow 2009-09-21 17:00:02

+1

我可以建议你不要这么快接受答案吗?这样我们可以得到最好的答案。如果是这种情况,并且所有的ID都保证在一个无关的空间中结束(听起来像你的输入代码需要调整,如果是这种情况),看看Nick D的答案。无论如何,我会更新我的答案。 – 2009-09-21 17:01:45

+0

你说得对,对不起! – flow 2009-09-21 17:14:48

0

将ID复制到可以修改的临时字符串,并从新字符串的末尾剥离空间(我假设它是空格)。

+0

此解决方案的成本时间和空间。 – Calyth 2009-09-21 17:06:01

+0

OP没有说他在汇编于1972年 – shufler 2009-09-21 18:58:43

+0

这是C.功课之外编写这个程序中,有通常一个体面的人之所以写C.东西即使他们在脚本语言编写,有是指定字符串而不明确复制它的方法(该语言可能在后台执行,但我不关心那部分)。 您建议的解决方案_explicitly_需要一份副本。 OP需要的东西就像Python中的ID [: - 1]。你建议的是NewID = str(ID [: - 1])。 有比两个小时更好的解决方案(如接受的答案)。 – Calyth 2009-09-21 20:15:36

0

你的ID字符串似乎有一个尾随空格。

尝试像

int i = strlen(ID); 
if (ID[i-1] == ' ') ID[i-1] = '\0' 

这确实不过编辑字符串....

+0

他非常具体地说,他不能修改ID字符串。阅读问题。 – 2009-09-21 17:05:52

+0

好点。错过了。 – Calyth 2009-09-21 20:16:31

0

虽然无法改变“ID”,为什么不把它复制,然后消除拷贝尾随空间打印,而不是?

。假定 “MyString的” 是 “的char *” 的类型定义,这可能工作(注:+ =加,* =修改):

 
    ... 
    mystring ID; 
+ mystring IDtmp = strdup(ID); 
+ for (size_t l = strlen(ID2); l != 0 && isspace(IDtmp[l-1]); --l) 
+  IDtmp[l-1] = '\0'; 
    char dum[]="_";   
* fprintf(fp_file,"%s%s%d ",IDtmp,dum,1); 
+ free(IDtmp); 
... 

当然,用的std :: string或另一个字符串类,对strdup(),strlen()和free()的调用必须根据需要进行替换或删除。

+0

请注意''strdup()'是非标准的。 – 2009-09-22 01:50:10

+0

是的,但它是哦,说明像这样一个点这么有用。 – 2009-11-30 15:31:01

0

如果您的ID字符串始终包含尾随空格,您可以将退格字符添加到fprintf()格式字符串以将其删除。

这是一个有点哈克,但这个小例子程序对我的作品(TM):

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    FILE * fp; 
    const char *id = "customers "; 
    const char *dum = "_"; 
    fp = fopen("foo.txt", "w"); 
    if (fp) { 
      fprintf(fp, "%s\b%s%d\n", id, dum, 1); 
      fclose(fp); 
    } 
    return 0; 
} 
相关问题