我试着编写一个函数,在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 ...时出错...
答案 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可以获得一些灵感。
答案 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
之外,您不需要任何标题。此外,i
和j
变量尚未使用。
编辑:错过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)
但没有解决问题。