试图编写一个从用户那里获取名字的函数

时间:2012-05-09 18:07:10

标签: c

我试着编写一个函数,在10到60,000之间得到一些候选者, 并获得每个候选人的名字...... 这就是我写的:

/********** Headers **********/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
/********** Consts **********/
const number_candidates;

/********** Functions **********/
void get_candidates(char *arr[256][256])
{
    int counter = 1, i = 0, j =0;
    int temp = 0;

    printf ("Please enter the number of candidates: \n");
    scanf ("%d", &temp);
    while (temp < 10 && temp > 60000)
    {
        printf ("Please enter the number of candidates: \n");
        scanf ("%d", temp);
    }
    const number_candidates = temp;
    while (counter < number_candidates + 1)
    {
        printf ("Please enter the %d name: \n", counter);
        fgets (arr, 256, stdin);
        counter++;
    }
}

int main(int argc, char *argv[])
{
    int i = 0;
    char can_names[256][256];

    get_candidates(&can_names);

    system("PAUSE");
    return 0;
}

将名字输入arr ...时出错...

5 个答案:

答案 0 :(得分:2)

你应该避免使用像这样的参数:char *arr[256][256] ......有什么意义呢?你应该考虑你的功能会做什么。你想要它加载候选人的名字吗?因此,您可以在其中定义 struct candidate ,其中包含属性name

typedef struct candidate{
    char name[256];
} Candidate;

另一件事:为什么要将数组的地址传递给此函数?你只是希望你的数组充满数据,你不会使用数组本身,因此它足以传递一个数组,而不是它的地址。

然后您的函数原型可以更改为void get_candidates(Candidate* candidates),这更容易阅读。看看这个函数的使用有多么简单:

Candidate candidates[256];
get_candidates(candidates);

最后一件事:在你写这样的函数之前,先尝试一些更简单的东西(找出那里发生的事情)。 这是一个例子:

#include <stdio.h>

typedef struct candidate{
    char name[256];
} Candidate;

void get_candidates(Candidate* candidates){
    scanf("%255s", candidates[4].name);
}

int main(int argc, char *argv[]){
    Candidate candidates[256];
    get_candidates(candidates);
    printf("%s\n", candidates[4].name);
    return 0;
}

如果在调用get_candidates之前你不知道候选人的数量,那么最好将这个函数的原型更改为Candidate* get_candidates(),这样很明显这个函数创建了一个数组: / p>

// caller is responsible for calling free on return value
Candidate* get_candidates(){
    Candidate* candidates;
    int count = 50; // here you found out the count
    candidates = malloc(count*sizeof(Candidate));
    fgets(candidates[4].name, 255, stdin);
    return candidates;
}

int main(int argc, char *argv[]){
    Candidate* candidates = get_candidates();
    printf("%s\n", candidates[4].name);
    free(candidates);
    return 0;
}

答案 1 :(得分:0)

查看the documentation for scanf,它表示变量需要像第一次调用scanf时那样作为指针传递。然后看看你对scanf的第二次调用...

您目前只是一遍又一遍地为数组中的第一个字符串指定名称。看看while循环,特别是你如何传递'arr'变量。看看here可以获得一些灵感。

打印出遍历数组所需的所有名称。您可以找到一些打印字符串列表herehere的示例。

答案 2 :(得分:0)

你应该致电:

counter = 0;
...
fgets (arr[counter], 256, stdin);


每个循环都需要走一步。

答案 3 :(得分:0)

有些事情是错的:

首先,您需要60000个名称的空间,但是您只需要分配足够的256个。好的,我们更改

char can_names[256][256];

char can_names[60000][256];

并且可能会出现...分段错误。那是因为数组使用了太多的堆栈空间。将其更改为

static char can_names[60000][256];

所以它不在堆栈中。


其次,没有必要获取数组的地址 - 它已经作为指针传递。您的函数调用更改为

get_candidates(can_names);

,函数签名是

void get_candidates(char arr[60000][256])

第三,您需要一个循环来一次读取一个条目。 for循环更容易阅读:

for (counter = 0; counter < number_candidates; counter++)
{
    printf ("Please enter the %d name: \n", counter);
    fgets (arr[counter], 256, stdin);
}

第四,条件

while (temp < 10 && temp > 60000)

应该是

while (temp < 10 || temp > 60000)

(如何将数字小于10且大于60000?)修复后,您可以删除temp的初始读取,因为循环将至少运行一次。请注意,如果您现在键入一个字母而不是一个数字,程序将进入无限循环(它将重复读取该字母)。解决这个问题只是一个练习。


第五,除了stdio.h之外,您不需要任何标题。此外,ij变量尚未使用。


编辑:错过scanf错误。 scanf地址作为参数。这也是有道理的:scanf需要某处存储一个值,它不关心当前值。所以对scanf的调用应该是:

scanf ("%d", &temp);

答案 4 :(得分:0)

不知道这是否会有所帮助,但请看下面的代码。 它动态工作即。它为所需的候选人分配了记忆,而不是假设其中有60,000人。

/*
 * Write a function, that get a number of candidates betwen 10 to 60,000, and gets a     name for each candidate 
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 256

int main(int argc, char*argv[]){

int i,n;
char **s;

printf("Enter the total number of candidates\n");
scanf("%d",&n);

//error condition
if(n<10 || n>60000){        
    printf("Sorry number of candidates should be between 10 to 60,000\n");
    return -1;      
}

//allocate memory
s = malloc(sizeof(char*)*n);

//get the data
for(i=0;i<n;i++){

    s[i] = calloc(MAX,sizeof(char));
    printf("Enter the candidate number %d's name:\n",i+1);
    //fgets(s[i],MAX,stdin);
    scanf("%s",s[i]);

}

//Display the data
printf("\nDetails of all the Candidates\n\n");
for(i=0;i<n;i++){
    printf("Candidate number %d's name:%s\n",i+1,s[i]);
}

//Free the memory
for(i=0;i<n;i++){
    free(s[i]);
}
free(s);

return 0;

}

我遇到了fgets的问题,它正在跳过第一个候选信息。任何帮助将不胜感激..我试过flush(stdin)但没有解决问题。