【问题标题】:How to check spaces in a string C?如何检查字符串C中的空格?
【发布时间】:2015-12-27 19:15:17
【问题描述】:

我试图让我的程序将用户名作为输入,然后打印出该名称的首字母。即汤米布朗-> tb

到目前为止,我所拥有的是:

int main (void)
{

char scroll[100] = {"kang cheng junga"};
printf ("%c\n", *(scroll+2));

for (int i=0; i<100; i++)
{
    if (*(scroll+i)=" ")
    {
        printf (*(scroll+i+1));
    }
}

我不断收到此错误:

错误:指向整数的指针不兼容 从 'char [2]' 分配给 'char' 的转换

[-Werror,-Wint-conversion] if (*(scroll+i)=" ")

错误:使用赋值的结果作为 不带括号的条件

[-Werror,-W括号] if (*(scroll+i)=" ")

谁能告诉我我是怎么搞砸的?我很难理解 * 和 & 在 C 中的作用。我是初学者,所以我真的不知道自己在做什么。

【问题讨论】:

  • 基本的东西:=应该是==
  • if (*(scroll+i)=" ") ==> if (*(scroll+i)==' ') 比较字符而不是字符和字符串。

标签: c arrays pointers error-handling


【解决方案1】:

除了strtok,这一次你还可以利用strpbrk轻松找到每个space

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

int main (void) {

    char scroll[100] = "kang cheng junga";
    char *p = scroll;

    printf ("\n full name: %s\n", scroll);
    printf (" initials : %c", *p);

    while ((p = strpbrk (p, " ")))
            printf ("%c", *++p);

    printf ("\n\n");

    return 0;
}

输出

$ ./bin/initials

 full name: kang cheng junga
 initials : kcj

您还可以使用单独使用指针的替代版本来消除对 string.h 的依赖:

#include <stdio.h>

int main (void) {

    char scroll[100] = "kang cheng junga";
    char *p = scroll;

    printf ("\n full name: %s\n", scroll);
    printf (" initials : %c", *p);

    while (*p++)
        if (*p == ' ' && *++p)
            printf ("%c", *p);

    printf ("\n\n");

    return 0;
}

【讨论】:

  • 我很好奇在检测到第一个空格后如何打印字符串的其余部分,例如本例中的“cheng junga”
  • 简单的方法是p = strchr (scroll, ' '); puts (p + 1);
  • 这是完美的工作。现在,只要我试图通过输入流“ for (i=0;i
  • 当您开始从输入流中读取数据时,您应该使用fgets() 将一行一次读入缓冲区,然后使用sscanf() 从缓冲区中解析您需要的内容。这可以确保您每次读取都使用一行输入,并且格式的变化不会破坏您的输入。例如char buf[256]; while (fgets (buf, sizeof buf, stdin)) { char first[64], middle[64], last[64]; if (sscanf (buf, "%s %s %s", first, middle, last) == 3) printf ("\nfirst: %s\nmiddle: %s\nlast: %s\n", first, middle, last); } 您可以根据需要复制buf 或任何子字符串以保存。
【解决方案2】:

您得到的错误是因为赋值运算符 (=) 。

if (*(scroll+i)=" ")// assigning a value(blank)
{
    printf (*(scroll+i+1));
}

if (*(scroll+i) == ' ')//Comparing it with a value (blank)
{
    printf (*(scroll+i+1));
}

【讨论】:

  • @noggy 还有你为什么将限制设置为 100?不必要地执行 for 循环 100 次
  • *(scroll+i) == " " ; -> *(scroll+i) == ' ' ;
  • 这个方法抛出警告:comparison between pointer and integer 我不允许我的代码有任何警告,这是不好的做法。
【解决方案3】:

在 C 中,= 是赋值运算符,== 是相等运算符。您需要使用后者。

也就是说,有一个不错的库函数,名为strtok(),它可以让您的生活更轻松。只需传递字符串和分隔符(此处为空格),它就会将令牌返回给您,您可以打印第一个字符以获取首字母。

【讨论】:

    【解决方案4】:

    这里加上 strtok 或 strchr 是一种简单的实现方式,缺少一些边界条件,例如名称以单字母结尾等

    #include <stdio.h>
    
    int main (void)
    {
    
            int i = 0;
            char scroll[100] = {"kang cheng junga"};
            char *p = scroll; // point to base
            printf("%c", *p ); // first letter is almost always certain
            while( *p != '\0' ) { // till end of String
    
                    if ( *(p-1)     == ' ' && *(p+1) != '\0') { // If previous is space and next letter exists
                            printf("%c", *p );      // take it save it or print it
                    }
                    p ++ ; //proceed
            }
    
            return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 2013-03-07
      • 2018-11-26
      相关资源
      最近更新 更多