2012-10-26 58 views
5

Câu hỏi được yêu cầu here rất giống với những gì tôi đang gặp sự cố. Sự khác biệt là tôi phải chuyển một đối số tới một hàm để loại bỏ các khoảng trắng và trả về mảng chuỗi/mảng kết quả. Tôi đã nhận được mã làm việc để loại bỏ các không gian nhưng đối với một số lý do tôi còn lại với các ký tự trailing còn sót lại từ mảng ban đầu. Tôi thậm chí đã thử strncpy nhưng tôi đã có rất nhiều lỗi.Chức năng xóa các khoảng trắng khỏi mảng chuỗi/char trong C

Dưới đây là những gì tôi có cho đến nay:

#include <stdio.h> 
#include <string.h> 
#define STRINGMAX 1000              /*Maximium input size is 1000 characters*/ 

char* deblank(char* input)             /* deblank accepts a char[] argument and returns a char[] */ 
{ 
    char *output=input; 
    for (int i = 0, j = 0; i<strlen(input); i++,j++)      /* Evaluate each character in the input */ 
    { 
     if (input[i]!=' ')             /* If the character is not a space */ 
      output[j]=input[i];            /* Copy that character to the output char[] */ 
     else 
      j--;               /* If it is a space then do not increment the output index (j), the next non-space will be entered at the current index */ 
    } 
    return output;               /* Return output char[]. Should have no spaces*/ 
} 
int main(void) { 
    char input[STRINGMAX]; 
    char terminate[] = "END\n";            /* Sentinal value to exit program */ 

    printf("STRING DE-BLANKER\n"); 
    printf("Please enter a string up to 1000 characters.\n> "); 
    fgets(input, STRINGMAX, stdin);           /* Read up to 1000 characters from stdin */ 

    while (strcmp(input, terminate) != 0)         /* Check for que to exit! */ 
    { 
     input[strlen(input) - 1] = '\0'; 
     printf("You typed: \"%s\"\n",input);        /* Prints the original input */ 
     printf("Your new string is: %s\n", deblank(input));     /* Prints the output from deblank(input) should have no spaces... DE-BLANKED!!! */ 

     printf("Please enter a string up to 1000 characters.\n> "); 
     fgets(input, STRINGMAX, stdin);          /* Read up to another 1000 characters from stdin... will continue until 'END' is entered*/ 
    } 
} 
+0

Bản sao có thể có của [Cách xóa tất cả dấu cách và tab khỏi một chuỗi nhất định bằng ngôn ngữ C?] (Http://stackoverflow.com/questions/1514660/how-to-remove-all-spaces-and -tabs-from-a-given-string-in-c-language) –

Trả lời

11

Sau khi loại bỏ các không gian trắng từ input bạn chưa chấm dứt nó với nul-terminator (\0) vì chiều dài mới là nhỏ hơn hoặc bằng với chuỗi gốc.

Chỉ nul-chấm dứt nó ở của cuối cùng của bạn cho vòng lặp:

char* deblank(char* input)           
{ 
    int i,j; 
    char *output=input; 
    for (i = 0, j = 0; i<strlen(input); i++,j++)   
    { 
     if (input[i]!=' ')       
      output[j]=input[i];      
     else 
      j--;          
    } 
    output[j]=0; 
    return output; 
} 
+0

Làm việc tốt cho tôi! Cảm ơn.Đã phải di chuyển khai báo j ra khỏi vòng lặp for để cho nó khả năng hiển thị phạm vi chức năng. –

10

Bạn sẽ không chấm dứt đầu ra, và vì nó có thể đã bị thu hẹp, bạn đang rời khỏi đuôi cũ trong đó.

Ngoài ra, tôi sẽ đề nghị rằng việc xử lý j, luôn được tăng lên trong vòng lặp và sau đó phải được giảm theo cách thủ công nếu ký tự hiện tại không được sao chép, có phần phụ tối ưu. Nó không phải là rất rõ ràng, và nó làm công việc vô nghĩa (incrementing j) mà thậm chí đã được hoàn tác khi nó không mong muốn. Hơi bối rối.

Nó dễ dàng hơn viết như sau:

char * deblank(char *str) 
{ 
    char *out = str, *put = str; 

    for(; *str != '\0'; ++str) 
    { 
    if(*str != ' ') 
     *put++ = *str; 
    } 
    *put = '\0'; 

    return out; 
} 
+0

Tôi thích câu trả lời của bạn hơn nhưng tôi chỉ hiểu được con trỏ của trẻ sơ sinh. Cuốn sách tôi đang đọc cho lớp của tôi không giải thích những điều tốt cho những người mới bắt đầu tuyệt đối như bản thân tôi và tôi thành thật không thể giải thích những gì đang diễn ra với người hướng dẫn của tôi. Tôi có thể chia sẻ với nhau những gì bạn đã làm nếu tôi nhìn vào mã của bạn đủ lâu nhưng tôi thực sự không có khái niệm cơ bản về cách mã của bạn hoạt động. Ví dụ, làm thế nào để incrementing "+ +" làm việc với mảng char? Tôi nghĩ rằng chỉ có thể được sử dụng cho các kiểu dữ liệu số. Cảm ơn cho đầu vào của bạn anyway mặc dù! –

0

Như những người khác đã đề cập, cùng chuỗi được sử dụng cho cả nguồn và đích, và một kết thúc của chuỗi không được duy trì.

Bạn cũng có thể thực hiện theo cách sau.

char* deblank(char* input)             /* deblank accepts a char[] argument and returns a char[] */ 
{ 
    char *output; 
    output = malloc(strlen(input)+1); 

    int i=0, j=0; 
    for (i = 0, j = 0; i<strlen(input); i++,j++)      /* Evaluate each character in the input */ 
    { 
     if (input[i]!=' ')             /* If the character is not a space */ 
      output[j]=input[i];            /* Copy that character to the output char[] */ 
     else 
      j--;               /* If it is a space then do not increment the output index (j), the next non-space will be entered at the current index */ 
    } 

    output[j] ='\0'; 
    return output;               /* Return output char[]. Should have no spaces*/ 
} 
0

Bạn phải trả về chuỗi sau khi thêm null (\ 0) terminator sau khi cho khối loop

char* deblank(char* input)             
{ 
char *output=input; 
for (int i = 0, j = 0; i<strlen(input); i++,j++)       
{ 
    if (input[i]!=' ')             
     output[j]=input[i];            
    else`enter code here` 
     j--;                
} 
output[j]='\0'; 
return output;               
} 
0

Nếu bạn cần phải lọc nhiều hơn một ký tự cùng một lúc, bạn có thể tìm thấy một cái gì đó như:

char *FilterChars(char *String,char *Filter){ 
    int a=0,i=0; 
    char *Filtered=(char *)malloc(strlen(String)*sizeof(char)); 
    for(a=0;String[a];a++) 
    if(!strchr(Filter,String[a])) 
     Filtered[i++]=String[a]; 
    Filtered[i]=0; 
    return Filtered; 
} 

Có ích; chỉ cần cung cấp danh sách các ký tự trong * Bộ lọc bạn muốn loại bỏ. Ví dụ: "\ t \ n", cho các tab, dòng mới và dấu cách.

0

Mã này hoạt động với độ phức tạp về thời gian của O (n).

char str[]={"my name is Om"}; 
int c=0,j=0; 
while(str[c]!='\0'){ 
    if(str[c]!=' '){ 
     str[j++]=str[c]; 
    } 
    c++; 
} 
str[j]='\0'; 
printf("%s",str); 
Các vấn đề liên quan