7

ここで尋ねられる質問は、私が問題を抱えているものと非常に似ています。違いは、スペースを削除して結果の文字列/文字配列を返す関数に引数を渡す必要があることです。スペースを削除するコードが動作しましたが、何らかの理由で、元の配列から末尾の文字が残っています。strncpy も試しましたが、多くのエラーが発生していました。

これが私がこれまでに持っているものです:

#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*/
    }
}
4

6 に答える 6

15

から空白を削除した後、新しい長さが元の文字列以下であるため、inputnul-terminator()で終了していません。\0

forループの最後でnul-terminateするだけです。

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;
}
于 2012-10-26T09:34:15.523 に答える
12

出力を終了していません。縮小している可能性があるため、古いテールをそこに残しています。

jまた、ループ内で常にインクリメントされ、現在の文字がコピーされていない場合は手動でデクリメントする必要があるの処理は、最適ではないことをお勧めします。あまり明確ではなく、不要なj場合は元に戻す必要さえある無意味な作業 (インクリメント) を行っています。かなり混乱します。

次のように書くと簡単です。

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

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

  return out;
}
于 2012-10-26T09:28:01.317 に答える
0

一度に複数の文字をフィルタリングする必要がある場合は、次のようなものを見つけることができます。

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;
}

使える; 取り除きたい文字のリストを *Filter に指定するだけです。たとえば、タブ、改行、およびスペースの "\t\n "。

于 2013-10-18T13:12:31.650 に答える
0

他の人が述べたように、ソースと宛先の両方に同じ文字列が使用され、文字列の終わりは維持されません。

次の方法でもできます。

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*/
}
于 2012-10-26T09:40:28.147 に答える
0

for ループ ブロックの後に null(\0) ターミネータを追加した後、文字列を返す必要があります。

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;                                                          
}
于 2012-10-26T09:42:43.610 に答える