无法使函数读取双精度数组

问题描述

所以我有一段代码,我想存储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)"?

解决方法

我看到一个问题

char NAME[10][5];

应该是

char NAME[5][11];

这样,您将声明5个名称槽,每个名称槽最多10个字符。多余的空间用于字符串null终止符。

,

你有

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已经是您的指针。

,

我修复了6个小故障。查看以#<num>开头的评论

#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;
}
,

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

您正在混淆printname中的“ NAME”数组。此函数没有返回值,因为它具有空返回值,因此您不应键入任何返回值。另外,您还可以保存一些代码行,将其写在之前主要功能上,这是最佳做法:

void printname(){
//todo
}

int main(){
return 0;
}

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

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

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

您的代码段:

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

您不必在打印名的第一个参数中加上“&”。

最佳:

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

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

void printname(char Names[][11],Names[index]);
}

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