目前我的程序应该在命令行中输入用户输入的数字列表,然后找到这些数字的总和并将其打印出来。我的代码如下,我知道存储用户输入的单个数字,但是如果我想要一个以空格分隔的数字列表怎么办?
#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);
}
我希望能够在命令行中输入数字列表,并将这些数字存储到列表中,然后找到所有这些数字的总和。
,有人可以告诉我这样做的正确方法是什么?
答案 0 :(得分:1)
令我感到困惑的是你可以编写一个线程程序,但不知道:
你不能 cast 将一个字符串数组解析为一个int数组。在sum循环期间,你必须逐个解析 casts 。
/* 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]
而非pthread_create
传递给main
:
// the runner function declaration
void *runner(char **);
// the thread creation
pthread_create(&tid,&attr,(void *(*)(void *))(runner),(void *)(argv+1));
答案 1 :(得分: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"
等。
你当然可以使用带引号的列表,但是你添加了一些逻辑来从字符串中提取整数(例如用strtok
),而参数处理可以为你做。
其次,你的程序在这里至少需要六个整数,并且还会跳过第一个整数(你希望i
从0
开始:
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);
}