我无法从字符串中删除空格
I can't remove the spaces from a string
我目前正在 this challenge 上 reddit。
现在我的问题出在程序的底部(未完成),但我发布了整个问题以防它可能与它的顶部有关。
现在我试图通过将所有非 space 字符放入另一个字符数组来从用户应该输入的字符串中删除 spaces。但是,每次我打印时尝试打印带有假定删除的 spaces 的字符串,它只打印第一个单词。但是,我希望它将所有单词打印成一个组合单词。
例如,当我尝试转换 Hello World!
时,它应该给我 HelloWorld!
,但它只给我 Hello
。我尝试过使用指针和诸如此类的东西的不同方法,每次我都遇到同样的问题。这是怎么回事?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main(void)
{
char StringtobePacked[100]; //This is the string the user puts in
char StringtobePackedWOspaces[100]; //This is gonna be the string without spaces
int i , o , p; //incrementers/counters
double AmtfChrsnStrng;
//ask user for sentence input:
printf("Please type in sentence so I can pack it into the array:\n");
scanf("%s" , StringtobePacked);
//check for the amounts of letters in the sentence minus the spaces
for (i = 0; StringtobePacked[o] > i ; i++ , o++)
{
AmtfChrsnStrng++;
if (StringtobePacked[o] == ' ')
{
AmtfChrsnStrng--;
};
};
//now we know the amounts of letters in the sentence minus the spaces
//find the root and make that into the array size
double root = sqrt(AmtfChrsnStrng); //This is to find the square root of the (number) of letters in the string
int rootup = ceil(root); //this is to round up the double
char PackingArray[rootup][rootup]; //have a two dimensional array to pack sentence into
//make sure to check wether a sign is a space or not so as to not pack these
for (i = 0 , o = 0; StringtobePacked[i] != 0; i++)
{
if (StringtobePacked[i] != ' ')
{
StringtobePackedWOspaces[o] = StringtobePacked[i];
o++;
}
}
StringtobePackedWOspaces[o] = 0;
puts(StringtobePackedWOspaces);
//loop through the sentence in order to pack it into the array
// after end of column has been reached increment row
//now don't keep incrementing the column but increment it backwards so letters can be packed upwards
//print array by looping through , first columns then rows
//the starting position of the packing should be randomised
};
我建议您使用 fgets() 而不是 scanf()。
scanf("%s" , StringtobePacked);
不要使用这个
fgets(StringtobePacked,100,stdin);
因为带有 %s 说明符的 scanf() 将读取输入,直到它遇到空格或最大字段宽度(如果已指定)。
这给出了所需的输出。
您应该应用@ameyCU 在他们的问题中发布的建议。您还应该将 StringtobePacked[o] > i
更改为 StringtobePacked[o] != '[=15=]'
,正如@BLUEPIXY 在他们的评论中提到的那样。除此之外,您还可以使用一些变量而无需对其进行初始化。例如,您在以下行中使用了 o
和 AmtfChrsnStrng
,而没有先将它们分别设置为 0
和 0.0
:
for (i = 0; StringtobePacked[o] > i ; i++ , o++)
{
AmtfChrsnStrng++;
...
为了安全起见,您应该更改:
int i , o , p; //incrementers/counters
double AmtfChrsnStrng;
至:
int i=0, o=0, p=0; //incrementers/counters
double AmtfChrsnStrng = 0.0;
如果没有这些初始化,您的代码在调试模式下可能会工作,但在发布模式下它可能会失败。
也许您的代码存在更多问题,但这至少应该解决其中的一些问题。
注意:如果您想改进计算句子中字母数量减去空格的循环,请查看here. This适用于您的变量的解决方案如下所示:
for (i=0; StringtobePacked[i]; StringtobePacked[i]!=' ' ? i++ : *s++);
执行此 for
循环后,变量 i
包含句子中字母的数量减去空格。
char original[SIZE], packed[SIZE];
double amt = 0.0;
scanf("%f", original);
for (char * op = original, * pp = packed; *op; op++)
{
if (!isspace(*op))
{
*pp++ = *op;
amt++;
}
}
int dim = (int) ceil(sqrt(amt));
在 C 中处理字符串时,只需遍历源缓冲区和目标缓冲区中的指针。指针是 C 的本质,熟悉它们。这将为您留下 dim.
中的数组维度
我目前正在 this challenge 上 reddit。
现在我的问题出在程序的底部(未完成),但我发布了整个问题以防它可能与它的顶部有关。
现在我试图通过将所有非 space 字符放入另一个字符数组来从用户应该输入的字符串中删除 spaces。但是,每次我打印时尝试打印带有假定删除的 spaces 的字符串,它只打印第一个单词。但是,我希望它将所有单词打印成一个组合单词。
例如,当我尝试转换 Hello World!
时,它应该给我 HelloWorld!
,但它只给我 Hello
。我尝试过使用指针和诸如此类的东西的不同方法,每次我都遇到同样的问题。这是怎么回事?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main(void)
{
char StringtobePacked[100]; //This is the string the user puts in
char StringtobePackedWOspaces[100]; //This is gonna be the string without spaces
int i , o , p; //incrementers/counters
double AmtfChrsnStrng;
//ask user for sentence input:
printf("Please type in sentence so I can pack it into the array:\n");
scanf("%s" , StringtobePacked);
//check for the amounts of letters in the sentence minus the spaces
for (i = 0; StringtobePacked[o] > i ; i++ , o++)
{
AmtfChrsnStrng++;
if (StringtobePacked[o] == ' ')
{
AmtfChrsnStrng--;
};
};
//now we know the amounts of letters in the sentence minus the spaces
//find the root and make that into the array size
double root = sqrt(AmtfChrsnStrng); //This is to find the square root of the (number) of letters in the string
int rootup = ceil(root); //this is to round up the double
char PackingArray[rootup][rootup]; //have a two dimensional array to pack sentence into
//make sure to check wether a sign is a space or not so as to not pack these
for (i = 0 , o = 0; StringtobePacked[i] != 0; i++)
{
if (StringtobePacked[i] != ' ')
{
StringtobePackedWOspaces[o] = StringtobePacked[i];
o++;
}
}
StringtobePackedWOspaces[o] = 0;
puts(StringtobePackedWOspaces);
//loop through the sentence in order to pack it into the array
// after end of column has been reached increment row
//now don't keep incrementing the column but increment it backwards so letters can be packed upwards
//print array by looping through , first columns then rows
//the starting position of the packing should be randomised
};
我建议您使用 fgets() 而不是 scanf()。
scanf("%s" , StringtobePacked);
不要使用这个
fgets(StringtobePacked,100,stdin);
因为带有 %s 说明符的 scanf() 将读取输入,直到它遇到空格或最大字段宽度(如果已指定)。 这给出了所需的输出。
您应该应用@ameyCU 在他们的问题中发布的建议。您还应该将 StringtobePacked[o] > i
更改为 StringtobePacked[o] != '[=15=]'
,正如@BLUEPIXY 在他们的评论中提到的那样。除此之外,您还可以使用一些变量而无需对其进行初始化。例如,您在以下行中使用了 o
和 AmtfChrsnStrng
,而没有先将它们分别设置为 0
和 0.0
:
for (i = 0; StringtobePacked[o] > i ; i++ , o++)
{
AmtfChrsnStrng++;
...
为了安全起见,您应该更改:
int i , o , p; //incrementers/counters
double AmtfChrsnStrng;
至:
int i=0, o=0, p=0; //incrementers/counters
double AmtfChrsnStrng = 0.0;
如果没有这些初始化,您的代码在调试模式下可能会工作,但在发布模式下它可能会失败。
也许您的代码存在更多问题,但这至少应该解决其中的一些问题。
注意:如果您想改进计算句子中字母数量减去空格的循环,请查看here. This适用于您的变量的解决方案如下所示:
for (i=0; StringtobePacked[i]; StringtobePacked[i]!=' ' ? i++ : *s++);
执行此 for
循环后,变量 i
包含句子中字母的数量减去空格。
char original[SIZE], packed[SIZE];
double amt = 0.0;
scanf("%f", original);
for (char * op = original, * pp = packed; *op; op++)
{
if (!isspace(*op))
{
*pp++ = *op;
amt++;
}
}
int dim = (int) ceil(sqrt(amt));
在 C 中处理字符串时,只需遍历源缓冲区和目标缓冲区中的指针。指针是 C 的本质,熟悉它们。这将为您留下 dim.
中的数组维度