我试图在扫描后删除字符串的空格。该程序编译完美,但它没有显示任何输出,输出屏幕只是在扫描字符串后不断关闭。是否存在逻辑错误或者我的编译器存在问题(我正在使用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的错误,我只是检查我的编译器是否有效,只是碰巧粘贴该代码
答案 0 :(得分:2)
您的代码包含很多问题,您描述的行为很可能不是因为编译器中存在错误: - )
一些问题:
使用scanf("%s",str1)
代替scanf("%s",&str1)
。由于str1
被定义为字符数组,因此它会根据需要自动衰减为指向char的指针。
请注意,scanf("%s",str1)
永远不会读取任何空格,因为"%s"
被定义为跳过前导空格并在检测到第一个空格时停止读取。
在for (m=1;m<=len;)
和str1[m]
中,请注意C中的数组使用从零开始的indizes,即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语言方面有所帮助: - )
答案 1 :(得分:2)
有很多问题:
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++)
,这会使代码更清晰。可能还有一些问题。
顺便说一句,你的尝试不会从字符串中删除空格,它只显示字符串跳过空格。
答案 2 :(得分:1)
这里有许多较小的错误正在加起来。
首先,检查for循环的边界。您正在从索引1迭代到索引strlen(str1)
,包括在内。这是一个合理的尝试,但请记住,在C中,字符串索引从0开始,最高可达strlen(str1)
。你怎么调整循环来处理这个?
其次,看看这一行:
if (&str1[m] == " ") {
在这里,您尝试检查给定字符是否为空格字符。但是,这并不是你认为它做的。该表达式的左侧&str1[m]
是字符串str1
的第m个字符的内存地址。这应该让你暂停一下,因为如果你想比较给定位置的内存的内容,你就不应该查看地址那个记忆位置。事实上,这行代码的真正含义是&#34;如果数组中字符m的地址等于包含空字符串的字符串文字的地址,那么......,&#34;这不是你想要的。
我怀疑你可能先写下这一行开始了:
if (str1[m] == " ") {
这更接近你想要的,但仍然不太正确。在这里,表达式的左侧正确地表示&#34; str1
的第m个字符,&#34;它的类型是char
。然而,右侧是一个字符串文字。在C中,字符(单个字形)和字符串(字符序列)之间存在差异,因此不允许进行此比较。要解决此问题,请将行更改为“
if (str1[m] == ' ') {
这里,通过使用单引号而不是双引号,右侧被视为&#34;空格字符&#34;而不是&#34;包含空格的字符串。&#34;这些类型现在匹配。
有关此代码的其他一些细节需要进行一些清理。例如,看看你如何打印每个角色。这是将printf
与角色一起使用的正确方法吗?想想我们上面讨论的if语句,看看你是否可以修补你的代码。同样,看看你如何阅读字符串。而且这里和那里可能会有更多的小问题,但其中大多数都是这些现有主题的变体。
但我希望这有助于让你朝着正确的方向前进!
答案 3 :(得分:0)
For循环应从0开始,小于长度(不小于或等于)
字符串比较是错误的。应与char比较&#39; &#39; ,没有&amp;
快速发现不应做任何事情,非空间输出。你++两次。
&安培; on%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;
}
答案 4 :(得分:0)
你的逻辑中几乎没有错误。
scanf
在遇到任何space
或new line
时终止字符串。
阅读更多相关信息here。因此,请使用其他人说的fgets
。
&
中的C
代表地址。由于数组在C
中实现为指针,因此不建议在从&
获取字符串时使用stdin
。但scanf
可以像scanf("%s",str1)
或scanf("%s",&str[1])
在递增索引时,将m++
置于其他条件中。
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;
}