[英]Removing spaces in a string
我试图在扫描后删除字符串的空格。 该程序已完美编译,但未显示任何输出,并且在扫描字符串之后,输出屏幕只会不断关闭。 我的编译器是否存在逻辑错误或有问题(我正在使用devc ++编译器btw)。 任何帮助将不胜感激
int main()
{
char str1[100];
scanf("%s",&str1);
int len = strlen(str1);
int m;
for (m=0;m<=len;){
if (&str1[m]==" "){
m++;
}
else {
printf("%c",&str1[m]);
}
m++;
}
return 0;
}
编辑:对不起m = 1的错误,我只是在检查我的编译器是否有效,只是碰巧粘贴了该代码
您的代码包含很多问题,您描述的行为很可能不是由于编译器中的错误引起的:-)
一些问题:
使用scanf("%s",str1)
代替scanf("%s",&str1)
。 由于str1
被定义为字符数组,因此它会根据需要自动衰减为char的指针。
请注意, scanf("%s",str1)
永远不会在任何空白中读取,因为"%s"
被定义为跳过前导空白并且在检测到第一个空白时停止读入。
在for (m=1;m<=len;)
与str1[m]
一起使用时,请注意,C中的数组使用基于零的索引,即str1[0]..str1[len-1]
,使得m <= len
超出数组范围。 for (m=0;m<len;)
。
从类型的角度来看,表达式&str1[m]==" "
是正确的,但从语义上讲是胡说八道。 您正在将第m
个字符的内存地址与字符串文字" "
的内存地址进行比较。 请使用str1[m]==' '
代替,并注意单引号表示字符值,而不是双引号表示字符串文字。
语句printf("%c",&str1[m])
将字符的内存地址传递给printf而不是预期的字符值本身。 使用printf("%c",str1[m])
代替。
希望我能找到一切。 更正这些问题,打开编译器警告,然后尝试解决问题。 万一您遇到进一步的麻烦,请随时询问。
希望它对体验C语言有所帮助:-)
有很多问题:
scanf("%s")
读取带空格的字符串,而应使用fgets
(请参见注释)。 scanf("%s", &str1)
还是错误的,应该是scanf("%s", str1);
, str1
已经是字符串的地址 for (m = 0; m <= len;)
是错误的,应该是for (m = 0; m < len;)
,因为否则,您要检查的最后一个字符是NUL
字符串终止符。 if (&str1[m]==" ")
错误,则应编写if (str1[m]==' ')
, " "
不表示空格,而是字符串文字,而需要' '
。 printf("%c", &str1[m]);
是错误的,您要打印一个char
因此需要str1[m]
(不带&
)。 m++
并将其放入for
语句中: for (m = 1; m < len; m++)
,这使代码更清晰。 可能还有其他一些问题。
顺便说一句,您的尝试不会从字符串中删除空格,而只会显示字符串跳过空格。
这里汇总了许多较小的错误。
首先,检查for循环的边界。 您正在从索引1迭代到索引strlen(str1)
(包括)。 尝试这样做是合理的,但是请记住,在C中,字符串索引从0开始,一直上升到strlen(str1)
(包括)。 您如何调整循环以处理此问题?
其次,看一下这一行:
if (&str1[m] == " ") {
在这里,您尝试检查给定字符是否为空格字符。 但是,这并没有达到您的预期。 该表达式的左侧&str1[m]
是字符串str1
的第m个字符的内存地址。 那应该使您稍稍停顿一下,因为如果您要比较给定位置处的内存内容 ,则不应查看该内存位置的地址 。 实际上,这行代码的真正含义是“如果数组中字符m的地址等于包含空字符串的字符串文字的地址,则...”,这不是您想要的。
我怀疑您可能首先开始写以下代码:
if (str1[m] == " ") {
这更接近您想要的,但仍然不太正确。 在这里,表达式的左侧正确显示为“ str1
的第m个字符”,其类型为char
。 但是,右侧是字符串文字。 在C语言中,字符(单个字形)和字符串(字符序列)之间存在差异,因此不允许进行这种比较。 要解决此问题,请将行更改为
if (str1[m] == ' ') {
在这里,通过使用单引号而不是双引号,将右侧视为“空格字符”,而不是“包含空格的字符串”。 类型现在匹配。
有关此代码的其他一些细节需要清除。 例如,查看如何打印每个字符。 这是将printf
与字符配合使用的正确方法吗? 考虑一下我们上面讨论的if语句,看看是否可以修改代码。 同样,查看您如何读取字符串。 到处可能存在更多的小问题,但是其中大多数是这些现有主题的变体。
但是我希望这可以帮助您朝正确的方向前进!
For循环应从0开始且小于长度(不小于或等于)
字符串比较是错误的。 应该是char与''比较,否&
寻找空间不应该做任何事,非空间输出。 你++ m两次。
&在%c上输出的是地址而不是值
从内存中,scanf总是在空白上停止,因此需要fgets
int main()
{
char str1[100];
scanf("%s",str1);
int len = strlen(str1);
int m;
for (m=0;m<len;++m){
if (str1[m]!=' '){
printf("%c",str1[m]);
}
}
return 0;
}
您的逻辑中很少有错误。
scanf
在遇到任何space
或new line
终止字符串。 在此处了解更多信息。 因此,请使用其他人所说的fgets
。
C
&
代表地址。 由于数组在C
作为指针实现,因此不建议在从stdin
获取字符串时使用&
。 但是scanf
可以像scanf("%s",str1)
或scanf("%s",&str[1])
在增加索引时,将m++
放入else条件中。
C
数组索引从0而不是1开始。
因此,在这些更改之后,代码将变成类似
int main()
{
char str1[100];
fgets(str1, sizeof str1 , stdin);
int len = strlen(str1);
int m=0;
while(m < len){
if (str1[m] == ' '){
m++;
}
else {
printf("%c",str1[m]);
m++;
}
}
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.