【问题标题】:How to stop printing a string with condition?如何停止打印有条件的字符串?
【发布时间】:2019-09-12 12:22:13
【问题描述】:

我制作了名为“person”的结构。我想输入一个人的名字和姓氏(按该顺序,并用空格分隔)。在我的代码中出于某种原因 printf();不能正常工作。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3

struct person{
    char name_surname[50];   
};

int main(void){

    struct person M[N];
    int i,j;

    for(i=0;i<N;i++){

        printf("Enter name and surname:\n");
        fflush(stdin);
        gets(M[i].name_surname);

    }
    for(i=0;i<N;i++){
        for(j=0;j<strlen(M[i].name_surname);j++){
            if(M[j].name_surname!=' '){
                printf("%c", M[i].name_surname);
            }
            else{
                break;
            }
        }   
    }

    return 0;
}

【问题讨论】:

  • 请阅读How to Ask。你说它不起作用。以什么方式?你想要什么,你会得到什么?
  • @Blaze 我想你的意思是printf("%c", M[i].name_surname[j]); 和@klutt,你没有声明j。
  • @RoQuOTriX 没错,谢谢指正。
  • @RoQuOTriX 说什么?
  • j 我说的是未定义

标签: c string char


【解决方案1】:

从您共享的代码来看,您似乎只尝试打印名字。下面的代码应该可以做到这一点:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3

struct person{
    char name_surname[50];   
};

int main(void){

    struct person M[N];
    int i;

    for(i=0;i<N;i++){

        printf("Enter name and surname:\n");
        fflush(stdin);
        gets(M[i].name_surname);

    }
    for(i=0;i<N;i++){
        for(int j=0;j<strlen(M[i].name_surname);j++){
            if(M[i].name_surname[j]!=' '){
                printf("%c", M[i].name_surname[j]);
            }
            else{
                printf("\n");
                break;
            }
        }   
    }

    return 0;
}

M[i].name_surname - 这里M[i] 可以访问超出分配的内存,因为M[] 的大小N 被声明为3,而j 可以达到名称的长度。 其次,name_surname 不是字符——它是指向字符的指针。如果要打印jth 字符,则需要打印M[i].name_surname[j]。或者,您可以使用以下命令打印整个字符串:

printf("%s", M[i].name_surname);

【讨论】:

    【解决方案2】:

    看起来这只是您在 if 语句中查看数组的方式,而下一行不太正确 - 如果您打算从当前字符串中选择一个特定字符,它应该是 M[i].name_surname[j]。

    看看这是否效果更好:

        for(i=0;i<N;i++){
            for(j=0;j<strlen(M[i].name_surname);j++){
                if(M[i].name_surname[j]!=' '){
                    printf("%c", M[i].name_surname[j]);
                }
                else{
                    break;
                }
            }   
        }
    

    【讨论】:

      【解决方案3】:

      对于初学者来说,函数 gets 不是标准的 C 函数。请改用fgets。

      这个电话

      fflush(stdin);
      

      有未定义的行为。

      这个循环

          for(j=0;j<strlen(M[i].name_surname);j++){
              if(M[j].name_surname!=' '){
                  printf("%c", M[i].name_surname);
              }
              else{
                  break;
              }
          }   
      

      没有意义,并且 if 语句无效

      if(M[j].name_surname!=' '){
          ^^^^^^^^^^^^^^^
      

      至少你应该写

      if(M[i].name_surname[j] !=' ' ){ 
      

      但在任何情况下,只要下一个 printf 语句写得正确,就只会输出一个字符

      printf("%c\n", M[i].name_surname[j]); 
      

      也许你的意思如下

      #include <stdio.h>
      #include <string.h>
      
      #define N 3
      
      struct person
      {
          char name_surname[59];   
      };
      
      int main(void)
      {
          struct person M[N];
      
          for ( int i = 0; i < N; i++ )
          {
              printf( "Enter name and surname: " );
              fgets( M[i].name_surname, sizeof( M[i].name_surname ), stdin );
              M[i].name_surname[ strcspn( M[i].name_surname, "\n" ) ] = '\0';
          }   
      
          for ( int i = 0; i < N; i++ )
          {
              const char *p = strchr( M[i].name_surname, ' ' );
      
              if ( p != NULL )
              {
                  printf( "%*.*s ", 
                          ( int )( p - M[i].name_surname ),
                          ( int )( p - M[i].name_surname ),
                          M[i].name_surname );
      
                  size_t n = strspn( p, " " );
                  printf( "%s\n", p + n );
              }
              else
              {
                  printf( "%s\n", M[i].name_surname );
              }
          }
      
          return 0;
      }
      

      程序输出可能看起来像

      Enter name and surname: Bobby Fisher
      Enter name and surname: photosynthesis_bro
      Enter name and surname: Thomas Man
      Bobby Fisher
      photosynthesis_bro
      Thomas Man
      

      或以下

      #include <stdio.h>
      #include <string.h>
      
      #define N 3
      
      struct person
      {
          char name_surname[59];   
      };
      
      int main(void)
      {
          struct person M[N];
      
          for ( int i = 0; i < N; i++ )
          {
              printf( "Enter name and surname: " );
              fgets( M[i].name_surname, sizeof( M[i].name_surname ), stdin );
              M[i].name_surname[ strcspn( M[i].name_surname, "\n" ) ] = '\0';
          }   
      
          for ( int i = 0; i < N; i++ )
          {
              size_t n = strspn( M[i].name_surname, " " );
      
              printf( "%c.\n", *( M[i].name_surname + n ) );
          }
      
          return 0;
      }
      

      程序输出是

      Enter name and surname: Bobby Fisher
      Enter name and surname: photosynthesis_bro
      Enter name and surname: Thomas Man
      B.
      p.
      T.
      

      【讨论】:

        猜你喜欢
        • 2021-12-29
        • 1970-01-01
        • 2013-07-23
        • 2017-06-25
        • 1970-01-01
        • 1970-01-01
        • 2017-03-30
        • 2015-12-31
        相关资源
        最近更新 更多