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.
这里提出的问题与我的问题非常相似。区别在于,我必须将一个参数传递给一个函数,该函数删除空格并返回结果字符串/char数组。我得到了删除空格的代码,但由于某些原因,我留下了原始数组中遗留的拖尾字符。我甚至尝试过strncpy,但是我有很多错误。
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*/
}
}
6 个解决方案
#1
12
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.
在从输入中删除空白后,您没有终止它与nul-terminator(\0),因为新长度小于或等于原始字符串。
Just nul-terminate it at the of end your for loop:
在结束时,你的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;
}
#2
11
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.
另外,我建议对j的处理,它总是在循环中增加,如果当前的字符没有被复制,那么必须手工递减,以达到某种次优。它不是很清楚,它在做毫无意义的工作(增加j),甚至在不需要的时候也要被撤销。很让人困惑。
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;
}
#3
0
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*/
}
#4
0
You have to return the string after adding the null(\0) terminator after the for loop block
在为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;
}
#5
0
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.
有用的;只要提供一个你想去掉的过滤器中的字符列表。例如“\t\n”,用于制表符、换行符和空格。
#6
0
This code works with time complexity of O(n).
该代码与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);
#1
12
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.
在从输入中删除空白后,您没有终止它与nul-terminator(\0),因为新长度小于或等于原始字符串。
Just nul-terminate it at the of end your for loop:
在结束时,你的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;
}
#2
11
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.
另外,我建议对j的处理,它总是在循环中增加,如果当前的字符没有被复制,那么必须手工递减,以达到某种次优。它不是很清楚,它在做毫无意义的工作(增加j),甚至在不需要的时候也要被撤销。很让人困惑。
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;
}
#3
0
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*/
}
#4
0
You have to return the string after adding the null(\0) terminator after the for loop block
在为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;
}
#5
0
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.
有用的;只要提供一个你想去掉的过滤器中的字符列表。例如“\t\n”,用于制表符、换行符和空格。
#6
0
This code works with time complexity of O(n).
该代码与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);