如何检测字符串中的空格?

时间:2018-06-17 04:32:50

标签: c string spaces

问题是在字符串之间找到空格。如果检测到空格,则应在下一行打印下一个单词。 例如" 这是C " 它将打印为: 此\ n 为\ n C

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[20];
    int a,i;
    scanf("%[^\n]", str);
    a=strlen(str);
    for(i=0;i<a;i++)
    {
        printf("%s",str[i]);
        if(str[i]==0)
        {
          printf("\n");
        } 
    }
    return 0;
}

如何使此代码生效?

4 个答案:

答案 0 :(得分:3)

使用isspace()功能。另外,请不要忘记C字符串由'\0'终止。

请查看the man page了解更多详情。

答案 1 :(得分:3)

在你的程序中,制作

printf("%s",str[i]);

printf("%c",str[i]);

因为str[i]字符不是字符串,字符的格式说明符是%c%s表示字符串。

并改变

    if(str[i]==0)
    {
      printf("\n");
    }

    if(str[i]==' ')
    {
      printf("\n");
    }

每次检测到空格时都要打印换行符。

使用scanf()的宽度说明符,如

scanf("%19[^\n]", str);

其中19str字符数组的大小。

您可能还想检查scanf()的返回值,这是它完成的成功分配的数量。在这种情况下,它应该是1

此外,请使用string.h标头文件以使用strlen(),并且不需要包含stdlib.h

正如评论部分所述,strlen()会返回size_t而不是int,尽管基本上size_t是无符号整数。 请参阅What is size_t in Cthis

或者您可以使用fgets()strtok()之类的

char *ptr;
if( fgets(str, sizeof(str), stdin) )
{
    for(char *ptr=strtok(str, " "); ptr!=NULL; ptr=strtok(NULL, " "))
    {
        printf("\n%s", ptr);
    }
}

strtok()使用第二个参数中的字符作为分隔符来标记str

请注意,fgets()也会在尾随\n中读取。如果您需要将其删除,请执行

str[strlen(str)-1]='\0';

如果最后一个字符是\n

答案 2 :(得分:2)

以下提议的代码:

  1. 执行所需的功能
  2. 干净地编译
  3. 现在,建议的代码:

    #include <stdio.h>
    
    int main( void )
    {
        int ch;
    
        while( ( ch = getchar() ) != '\n' && EOF != ch )
        {
            if( ' ' == ch )
            {
                puts( "" );
            }
    
            putc( ch, stdout );
        }
    
        puts( "" );
    
        return 0;
    }
    

答案 3 :(得分:0)

您的程序在这里有未定义的行为

printf("%s",str[i]);

因为str[i]的类型为char,并且您使用%s格式说明符打印它,该格式说明符用于printf null终止的字符数组。

来自C标准#7.21.6.1p9

  

如果转换规范无效,则行为未定义.282)如果任何参数不是相应转换规范的正确类型,则行为未定义 [强调我的]

另外,请避免使用scanf()进行字符串输入。如果不小心使用,可能会出现缓冲区溢出问题。您应该使用fgets代替。

来到你的问题: The question is to find spaces between the string. And if spaces are detected the next word should be printed in the next line.

正如我在评论中建议的那样,您可以使用strtok()来做空格作为分隔符。 strtok()会将输入字符串拆分为标记。关于strtok()的注意事项是它通过分解为较小的字符串(标记)来修改输入字符串。如果你没事,那么你可以这样做:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUF_SZ 20

int main() {
        char str[BUF_SZ];
        char *pch;

        if (fgets (str, BUF_SZ, stdin) == NULL) {
                perror ("fgets failed");
                exit (EXIT_FAILURE);
        }

        str[strcspn (str, "\n")] = 0;

        pch = strtok (str," ");
        while (pch != NULL) {
                printf ("%s\n", pch);
                pch = strtok (NULL, " ");
        }

        return EXIT_SUCCESS;
}

while循环后,str的内容与调用strtok()之前的内容不同。但是,是否修改原始输入字符串在这里没有意义,因为在将其分解为令牌之后,它不会被更多地使用。

你的问题是 - if spaces are detected the next word should be printed in the next line..。如果只是打印新行中的单词,您可以这样做:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUF_SZ 20

int main() {
        char str[BUF_SZ];
        int word_size = 0;
        int i = 0, start = 0;

        if (fgets (str, BUF_SZ, stdin) == NULL) {
                perror ("fgets failed");
                exit (EXIT_FAILURE);
        }

        str[strcspn(str, "\n")] = 0;

        for (i = 0; str[i] != '\0'; i++) {
                start = i;
                if (str[i] != ' ') {
                        word_size++;
                        if (str[i+1] != '\0')
                                continue;
                        start++;
                }

                if (word_size != 0) {
                        printf ("%.*s\n", word_size, str + start - word_size);
                        word_size = 0;
                }
        }

        return EXIT_SUCCESS;
}

此解决方案不会修改输入字符串,只是解析它,如果检测到空格,则在新行中打印下一个字。