2009-09-21 4 views
0

를 인쇄 할 때 다시 이동다음의 코드 조각에 새로운 문자

"customers _1" 

하지만 내 의도 :

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

ID가 "customers "

같은 문자열입니다 그래서 출력을 얻을 얻을 것이다

"customers_1" 

기술적 인 이유로 ID를 수정할 수 없기 때문에 프로그램이 덤을 인쇄 할 때 ID의 일부인 공백을 덮어 쓰면 원하는 결과를 얻을 수 있습니다.

덕분에 많은

답변

6

은 다음과 같이 문자열 크기를 바인딩 :

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

아마 내 대답을 포함하여 여기에서 가장 효율적인 대답 일 것입니다. –

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

+1

너무 빨리 대답을 받아들이지 말라고 제안할까요? 그렇게하면 우리는 가장 좋은 대답을 얻을 수 있습니다. 이 경우, 모든 ID는 관계없는 공간에서 끝나도록 보장됩니다 (이 경우 입력 코드가 필요하면 조정해야 함). Nick D의 답변을 확인하십시오. 어쨌든 내 대답을 업데이트 할 것입니다. –

+0

맞아, 실례합니다! – flow

0

수정할 수있는 임시 문자열에 ID를 복사하고 새 문자열 끝에 공백이 있다고 가정합니다. 당신이 할 수있는

+0

이 솔루션의 시간과 공간. – Calyth

+0

OP는 그가 1972 년에 어셈블러에서이 프로그램을 작성한다고 말하지 않았다. – shufler

+0

그것은 C에있다. 숙제를 제외하고 사람들이 C로 사물을 쓰는 데는 일반적으로 괜찮은 이유가있다. 명시 적으로 복사하지 않고 문자열을 지정하는 방법입니다 (언어는 백그라운드에서 수행 할 수 있지만 그 부분은 신경 쓰지 않습니다). 솔루션 _explicitly_에 복사본이 필요합니다. OP가 원하는 것은 python에서 ID [: - 1]와 (과) 비슷한 것입니다. 당신이 제안하는 것은 NewID = str (ID [: - 1])입니다. 두 시간보다 더 나은 해결책 (예 : 수락 된 답변)이 있습니다. – Calyth

0

귀하의 ID 문자열은 후행 공백을 갖고있는 것 같아요.

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

이 비록 문자열을 편집하지 같은

시도 뭔가 ....

+0

그는 특히 ID 문자열을 수정할 수 없다고 말했습니다. 질문을 읽으십시오. –

+0

좋은 지적. 놓쳤다. – Calyth

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); 
... 

, 표준 : : 문자열이나 다른 문자열 클래스에서 strdup(), strlen() 및 free()에 대한 호출을 적절히 대체하거나 제거해야합니다.

+0

'strdup()'는 비표준 임에 유의하십시오. –

+0

예, 그렇지만이 점과 같은 점을 설명하는 데 유용합니다. –

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; 
} 
관련 문제