我正在尝试编写" C Primer Plus"书。在其中一个中,我遇到了一些我无法解决或弄清楚正在发生什么的事情。在逐步调试试验后,我刚刚对此进行了测试:
#include <stdio.h>
int main()
{
char str[500];
gets(str);
puts(str);
return 0;
}
输出(根据需要):
确切地说,我输入的所有内容
确切地说,我输入的所有内容
但是关于我试图做的练习,它对两个以上的连续空间很敏感。 gets()
之后是puts()
;但我不知道什么是错的。所以我引用整个代码:
/*
BUG: MORE THAN 1 SPACES NEXT TO EACHOTHER. WHERE THE FIRST CHARACTER GOES?!!
Write a function that takes a string as an argument and removes the spaces from the string.
Test it in a program that uses a loop to read lines until you enter an empty line.
The program should apply the function to each input string and display the result.
*/
#include <stdio.h>
#include <string.h>
int spaceRemover(char *in);
void takeBack(char *in);
int main(void)
{
puts("Enter a string for the SPACE-REMOVER: (RETURN to quit)");
do
{
char str[500];
int spaces;
gets(str);
puts(str); //for debugging to know is it complete just after gets() ?
//printf("\nFirst char of string: %c\n",str[0]);
//printf("\nFirst Char: %p '%c'\n",str,*str);
spaces=spaceRemover(str);
printf("\n%d spaces removed: \n",spaces);
puts(str);
puts("\nEnter a string for the SPACE-REMOVER: (RETURN to quit)");
}
while (getchar() != '\n');
return 0;
}
int spaceRemover(char *in)
{
int count=0, i;
for (i=0 ; i<strlen(in) ; i++)
while ( *(in+i)==' ' ) //IF will skip more than one space; but WHILE won't
{
//printf("%p '%c' \t B4: %p '%c'\n",in+i,*(in+i),in+i-1,*(in+i-1));
takeBack(in+i);
count++;
}
return count;
}
void takeBack(char *spaceLocation)
{
int j=0;
while (*(spaceLocation+j)!= '\0' )
{
*(spaceLocation+j) = *(spaceLocation+j+1);
//putchar(*(spaceLocation+j+1));
j++;
}
return;
}
输出:
Enter a string for the SPACE-REMOVER: (RETURN to quit)
this is separated by single spaces
this is separated by single spaces
5 spaces removed:
thisisseparatedbysinglespaces
Enter a string for the SPACE-REMOVER: (RETURN to quit)
I'll try more than single space separators
'll try more than single space separators
13 spaces removed:
'lltrymorethansinglespaceseparators
注意:使用Blockquote与此一个,丢弃连续的空格。
这里发生了什么? 我的代码有什么问题导致这个吗?
(使用Code :: Blocks with gcc。)
答案 0 :(得分:0)
字符串的第一个字符在哪里?
getchar
中的while (getchar() != '\n');
会读取您的第一个字符。当您输入字符串
I'll try more than single space separators
然后I
读取第一个字符getchar
并与\n
进行比较。因此,只留下
'll try more than single space separators
输入缓冲区中的由gets
读取。将main
正文更改为:
char str[500];
puts("Enter a string for the SPACE-REMOVER: (RETURN to quit)");
gets(str);
do
{
int spaces;
puts(str); //for debugging to know is it complete just after gets() ?
//printf("\nFirst char of string: %c\n",str[0]);
//printf("\nFirst Char: %p '%c'\n",str,*str);
spaces=spaceRemover(str);
printf("\n%d spaces removed: \n",spaces);
puts(str);
puts("\nEnter a string for the SPACE-REMOVER: (RETURN to quit)");
gets(str);
}
while (str[0]);
答案 1 :(得分:0)
问题在于你的循环退出条件,即当你说
时puts("\nEnter a string for the SPACE-REMOVER: (RETURN to quit)");
在循环内部并开始输入字符串,您的getchar()
开始期待stdin的字符,该字符由字符串的第一个字符提供。因此,在下一次迭代中,str的第一个字符不是你预期的那样。
所以要使代码按照要求运行
即。
输入字符串,直到没有输入空字符串。
专业提示:不要使用获取,这是一个危险的例程。请改用fgets。阅读更多here
将主程序中的循环更改为此。
do
{
int spaces;
//for debugging to know is it complete just after gets() ?
//printf("\nFirst char of string: %c\n",str[0]);
//printf("\nFirst Char: %p '%c'\n",str,*str);
spaces=spaceRemover(str);
printf("\n%d spaces removed: \n",spaces);
puts(str);
puts("\nEnter a string for the SPACE-REMOVER: (RETURN to quit)");
gets(str);
puts(str);
}
while (strcmp(str,""));