The question asked here is very similar to what I am having a problem with. The difference is that I must pass an argument to a function that removes the spaces and returns the resulting string/char array. I got the code working to remove the spaces but for some reason I am left with trailing characters left over from the original array. I even tried strncpy but I was having lots of errors.
Here is what I have so far:
#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*/
}
}
After removing the white spaces from the input
you have not terminated it with nul-terminator ( \\0
) because the new length is less than or equal to the original string.
Just nul-terminate it at the of end your for loop:
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;
}
You're not terminating the output, and since it might have shrunk, you're leaving the old tail in there.
Also, I would suggest that the treatment of j
, which is always incremented in the loop and then has to be manually decremented if the current character is not copied, to be somewhat sub-optimal. It's not very clear, and it's doing pointless work (incrementing j
) which even has to be undone when it's not desired. Quite confusing.
It's easier written as:
char * deblank(char *str)
{
char *out = str, *put = str;
for(; *str != '\0'; ++str)
{
if(*str != ' ')
*put++ = *str;
}
*put = '\0';
return out;
}
As others mentioned, same string is used for both source and destination, and a end of string is not maintained.
You could do in the following way also.
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*/
}
You have to return the string after adding the null(\\0) terminator after the for loop block
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;
}
If you need to filter more than one character at a time, you might find something like:
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;
}
Useful; just provide a list of characters in *Filter you wish to strip out. For example "\\t\\n ", for tabs, newlines and spaces.
This code works with time complexity of 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);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.