-1

目前我的程序应该获取用户在命令行输入的数字列表,然后找到这些数字的总和并将其打印出来。我的代码如下,我知道要存储用户输入的单个数字,但是如果我想要一个数字列表,用空格分隔怎么办?

#include <pthread.h>
#include <stdio.h>
int sum; /* this data is shared by the thread(s) */
void *runner(char **); /* threads call this function */
int main(int argc, char *argv[])
{
pthread_t tid; /* the thread identifier */
pthread_t tid2;

pthread_attr_t attr; /* set of thread attributes */

if (argc != 2) {
fprintf(stderr,"usage: a.out <integer values>\n");
return -1;
}

pthread_attr_init(&attr);

pthread_create(&tid,&attr,(void(*)(void *))(runner),(void *)(argv+1));

pthread_join(tid,NULL);

printf("sum = %d\n",sum);
}
/* The thread will begin control in this function */
void *runner(char **param)
{
int i;
sum = 0;
for (i = 1; i <= 5; i++)
   sum = sum + atoi(param[i]);

pthread_exit(0);
}

我希望能够在命令行中输入一个数字列表,并将这些数字存储到一个列表中,然后找到所有这些数字的总和。

,有人能告诉我这样做的正确方法是什么吗?

4

2 回答 2

1

让我感到困惑的是,您可以编写一个线程程序但不知道:

您不能解析字符串数组转换为 int 数组。在求和循环期间,您必须一一解析转换。

/* The thread will begin control in this function */
void *runner(char **param)
{
int i;

sum = 0;
for (i = 1; i <= upper; i++)
    sum = sum + atoi(param[i]);
pthread_exit(0);
}

您还需要通过而argv+1不是argv[1]in :pthread_createmain

// the runner function declaration
void *runner(char **);

// the thread creation
pthread_create(&tid,&attr,(void *(*)(void *))(runner),(void *)(argv+1));
于 2013-03-10T22:26:59.947 回答
1

这里有一些问题:

if (argc != 2)

这意味着您期望引用整数值,即a.out "1 2 3 4 5". 如果您以这种方式执行操作,则数字将表示为单个字符串,即argv[1] := "1 2 3 4 5".

更容易检查argc < 2参数并将其作为a.out 1 2 3 4 5. 这样每个参数都有自己的字符串,即argv[1] := "1", argv[2] := "2"等。

您当然可以改用带引号的列表,但是您已经添加了一些逻辑来从字符串中提取整数(例如 with strtok),而参数处理可以代替您。

其次,您的程序在这里至少需要六个整数,并且还会跳过第一个(您想i0

for (i = 1; i <= 5; i++)
   sum = sum + atoi(param[i]);

至于上限,将整数的数量与其字符串一起传送的一种方法是使用结构:

struct arg_struct {
    int argc;
    char **argv;
};

然后在调用时使用这样的结构pthread_create,即

struct arg_struct args = { argc-1, argv+1 };
pthread_create(&tid,&attr,(void(*)(void *))(runner),(void *)(&args));

runner相应地改变:

void *runner(struct arg_struct *param)
{
int i;
sum = 0;
for (i = 0; i < param->argc; i++)
   sum = sum + atoi(param->argv[i]);

pthread_exit(0);
}

这是所有更改的代码:

#include <pthread.h>
#include <stdio.h>

struct arg_struct {
    int argc;
    char **argv;
};

int sum; /* this data is shared by the thread(s) */
void *runner(struct arg_struct *); /* threads call this function */
int main(int argc, char *argv[])
{
pthread_t tid; /* the thread identifier */
pthread_t tid2;

pthread_attr_t attr; /* set of thread attributes */

struct arg_struct args = { argc-1, argv+1 };

if (argc < 2) {
fprintf(stderr,"usage: a.out <integer values>\n");
return -1;
}

pthread_attr_init(&attr);

pthread_create(&tid,&attr,(void *(*)(void *))(runner),(void *)(&args));

pthread_join(tid,NULL);

printf("sum = %d\n",sum);
}
/* The thread will begin control in this function */
void *runner(struct arg_struct *param)
{
int i;
sum = 0;
for (i = 0; i < param->argc; i++)
   sum = sum + atoi(param->argv[i]);

pthread_exit(0);
}
于 2013-03-11T00:50:43.957 回答