字符串的第一个字符在哪里?

时间:2014-06-24 06:32:50

标签: c arrays string character

我正在尝试编写" 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。)

2 个答案:

答案 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,""));