尋ねられた質問 ここ は私が問題を抱えているものと非常に似ています。違いは、スペースを削除して結果の文字列/文字配列を返す関数に引数を渡す必要があることです。スペースを削除するようにコードを機能させましたが、何らかの理由で、元の配列から末尾の文字が残っています。 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*/
}
}
input
から空白を削除した後、nul-terminator(\0
)新しい長さが元の文字列以下であるため。
Forループの最後でヌル終了します。
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;
}
出力を終了しているわけではなく、出力が縮小している可能性があるため、古いテールをそこに残しています。
また、j
の処理は、ループ内で常にインクリメントされ、現在の文字がコピーされていない場合は手動でデクリメントする必要があるため、最適ではないことをお勧めします。あまり明確ではなく、無意味な作業(j
のインクリメント)を行っており、不要な場合は元に戻す必要があります。かなり混乱しています。
次のように書く方が簡単です。
char * deblank(char *str)
{
char *out = str, *put = str;
for(; *str != '\0'; ++str)
{
if(*str != ' ')
*put++ = *str;
}
*put = '\0';
return out;
}
他の人が述べたように、同じ文字列が送信元と宛先の両方に使用され、文字列の終わりは維持されません。
次の方法でも行うことができます。
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*/
}
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;
}
このコードは、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);
一度に複数の文字をフィルタリングする必要がある場合は、次のようなものが見つかる可能性があります。
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」。