【问题标题】:Cannot make function read Double array无法使函数读取双数组
【发布时间】:2021-02-13 00:58:01
【问题描述】:

所以我有一段代码,我想存储 5 个随机名称,每个名称不超过 10 个字母

void printname(char *s);

int main() {
  char NAME[10][5];
  int NAMECOUNTER=0;
  while(NAMECOUNTER<5) {
    scanf("%s",NAME[NAMECOUNTER]);
    printname(&NAME[NAMECOUNTER]);
    NAMECOUNTER++;
  }
}

void printname(char *s) {
 printf("Hello %s\n",*s);
 return;
}

And lets say i want the name to print itself through function Printname. Why does this not work and prints "Hello (null)"?

【问题讨论】:

    标签: arrays c string function pointers


    【解决方案1】:

    我看到的一个问题

    char NAME[10][5];
    

    应该是

    char NAME[5][11];
    

    这样您就声明了 5 个名称槽,每个名称槽最多 10 个字符。额外的空间用于字符串空终止符。

    【讨论】:

      【解决方案2】:

      你有

      void printname(char *s) {
       printf("Hello %s\n",*s); 
       return;
      }
      

      你需要

      void printname(char *s) {
       printf("Hello %s\n",s);  // Took off the * from the *s
       return;
      }
      

      因为 s 已经是你的指针了。

      【讨论】:

        【解决方案3】:

        我给出了 6 个要修复的故障。参见 cmets 前言 #&lt;num&gt;

        #include <stdio.h>
        #include <stdlib.h>
        
        void printname(char *s);
        
        int main() {
            char NAME[5][11] = {0}; // #1 value initialize to zero
                                    // #2 the second dimension should be 11, since 10 letters plus null-character
            int NAMECOUNTER=0;
            while(NAMECOUNTER<5) {
                scanf("%10s",NAME[NAMECOUNTER]);  // #3 %10s width specifier, limit the length of name up to 10 character long
                while ( (ret = getchar()) != '\n') ; // #4 trim exceeding characters
                printname(NAME[NAMECOUNTER]);  // #5 no &
                NAMECOUNTER++;
            }
        }
        
        void printname(char *s) {
            printf("Hello %s\n",s); // #6 no *
            return;
        }
        

        【讨论】:

          【解决方案4】:

          您的代码甚至没有向我打印任何内容,它只是冻结并关闭。也不是很清楚。

          您在 printname 中输入错误的“NAME”数组。这个函数没有返回值,因为它有一个 void 返回,所以你不应该输入任何返回值。您还可以在 主函数之前保存一些代码行,这是最佳实践:

          void printname(){
          //todo
          }
          
          int main(){
          return 0;
          }
          

          这是实现功能的更好方法:

          void printname(char Names[5][11], int index){
              printf("Hello %s\n", Name[index]);
          }
          

          您可以将 while 结构替换为 for 结构,因为在这种情况下它是达到此目的的最佳应用程序:

          你的代码片段:

          while(NAMECOUNTER<5) {
              scanf("%s",NAME[NAMECOUNTER]);
              printname(&NAME[NAMECOUNTER]);
              NAMECOUNTER++;
          }
          

          您不必将“&”放在 printname 的第一个参数中。

          最佳:

          for(NameCounter = 0; NameCounter < 5; NameCounter++){
                  scanf("%s",NAME[NAMECOUNTER]);
                  printname(NAME[NAMECOUNTER]);
          }
          

          还要确保您的代码缩进清晰。这是您的最终代码:

          void printname(char Names[][11], int index){
              printf("Hello %s\n", Names[index]);
          }
          
          int main(){
              
              char NAME[5][11];
              int NAMECOUNTER;;
              for(NAMECOUNTER = 0; NAMECOUNTER < 5; NAMECOUNTER++){
                  
                  scanf("%s", NAME[NAMECOUNTER]);
                  printname(NAME, NAMECOUNTER);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-07-23
            • 2019-11-11
            • 2015-06-16
            • 2020-12-18
            • 1970-01-01
            • 2021-11-27
            • 1970-01-01
            • 2022-08-17
            相关资源
            最近更新 更多