Вернуться при печати нового символа - PullRequest
0 голосов
/ 21 сентября 2009

в следующем фрагменте кода:

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

ID - это строка типа "customers "

поэтому я получаю вывод:

"customers _1"

Но я намерен получить

"customers_1"

По техническим причинам я не могу изменить идентификатор каким-либо образом, поэтому мне интересно, как, когда программа печатает dum, она может вернуть символ назад, перезаписывая пробел, который является частью идентификатора, чтобы я получил желаемый результат .

Большое спасибо

Ответы [ 6 ]

6 голосов
/ 21 сентября 2009

Вы можете ограничить размер строки следующим образом:

fprintf(fp_file,"%.*s%s%d   ",strlen(ID)-1, ID, dum, 1);
1 голос
/ 21 сентября 2009

Почему бы просто не перебрать строку идентификатора, пока не найдете пробел, и напечатать каждый символ , за исключением пробела. Попробуйте это:

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(), чтобы найти пробелы и вычислить длину идентификатора, который вы хотите напечатать с этим, потому что спецификатор printf() %s может использоваться для печати только части строки, но тогда вы ' Я буду зацикливаться на строке дважды. Таким образом, мы делаем это только один раз. Использование:

print_id(ID, '_', 1);

Обновление: если вам нужны все символы, кроме последнего, ответ Ника Д. - это путь. Он использует одну из наиболее эзотерических функций семейства функций *printf(), чтобы заставить printf() печатать только до последнего символа. Есть способ сделать это с помощью цикла и fputc(), но небольшая разница в эффективности не стоит того, чтобы работать над тем, как написать и документировать это, чтобы ваш преемник мог понять, что вы делаете , Потому что вы это документируете, верно? : P

0 голосов
/ 22 сентября 2009

Если ваша строка идентификатора всегда содержит завершающий пробел, вы можете добавить символы возврата на строку в строку формата fprintf (), чтобы удалить их.

Это немного странно, но этот небольшой пример программы Works For Me (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;
}
0 голосов
/ 21 сентября 2009

Несмотря на то, что вы не можете изменить «ID», почему бы не скопировать его, а затем удалить завершающий пробел в копии и напечатать его вместо этого?

Предполагая, что "mystring" является typedef для "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 голосов
/ 21 сентября 2009

Кажется, в вашей строке идентификатора есть пробел.

попробуйте что-то вроде

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

Это редактирует строку, хотя ....

0 голосов
/ 21 сентября 2009

Скопируйте идентификатор во временную строку, которую вы можете изменить, и уберите пробел (я предполагаю, что это пробел) с конца вашей новой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...