我尝试编辑此代码以使用ints参数:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
void* worker (void* param) {
int* nr = (int *) param;
printf ("I got: %d\n",nr);
}
int main (int argc, int *argv[])
{
pthread_t th;
int i;
for(i=1;i<argc;i++){
pthread_create (&th, NULL, worker,(void*)argv[i]);
pthread_join (th, NULL);
}
}
这不起作用,关于指针,我不明白。有人能解释一下吗?我不想使用&#34; atoi&#34;功能。 对于5号和2号,我得到:-1078000975,-1078000973和警告:
11:3:警告:格式'%d'需要类型为'int'的参数,但参数2的类型为'int *'[-Wformat =] printf(&#34;我得到了:%d \ n&#34;,nr); ^
答案 0 :(得分:0)
如果你收到的论点小于10,你可以这样做:
pthread_create (&th, NULL, worker,(void*)(argv[i][0]-'0'));
这可以完成,因为ASCII数字从48开始('0'值)。因此,如果你收到一个'7'(55 ascii数字),你可以减去'0'得到它:55-48 = 7。 如果参数可以是10或更大,则必须使用atoi或该函数的自我实现,因为您无法在C中从char *转换为int。
您的代码还有另一个问题,您尝试打印int *,它只是一个包含内存地址的变量。你应该把它当作一个int:
void* worker (void* param)
{
int nr = (int) param;
printf ("I got: %d\n",nr);
}
编辑: 所以你的代码应该是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
void* worker (void* param) {
int nr = (int) param;
printf ("I got: %d\n",nr);
}
int main (int argc, char *argv[])
{
pthread_t th;
int i;
for(i=1;i<argc;i++){
pthread_create (&th, NULL, worker,(void*)(argv[i][0]-'0'));
pthread_join (th, NULL);
}
}
对我有用......
答案 1 :(得分:0)
一些问题:
argv
应写为char * argv[]
,而不是int * argv[]
。
您(void *)
来电中的pthread_create()
演员阵容是不必要的。
您的线程函数应返回void *
。
atoi()
,或其功能更强大的表兄strtol()
,正好您正在寻找的内容,在此处。您可以使用它们,也可以手动转换字符串,这不是最理想的。
这是一个有效的版本:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void * worker (void * param)
{
char * numstr = param, * endptr;
long num = strtol(numstr, &endptr, 0);
if ( *endptr ) {
printf("Invalid number.\n");
}
else {
printf ("I got: %ld\n", num);
}
return NULL;
}
int main (int argc, char *argv[])
{
pthread_t th;
for ( int i = 1; i < argc; ++i ) {
pthread_create (&th, NULL, worker, argv[i]);
pthread_join (th, NULL);
}
return 0;
}
和一些示例输出:
paul@horus:~/src/sandbox$ ./trd 5 haha 10
I got: 5
Invalid number.
I got: 10
paul@horus:~/src/sandbox$
答案 2 :(得分:0)
您应该将指针传递给字符串,然后对其进行操作。
pthread_create (&th, NULL, worker, argv[i]); //cast is not required
void* worker (void* param) {
char* nr = param ;
现在你在线程中得到了你的字符串。获取第一个字符,并将其转换为整数。
int n = nr[0]-'0' ;
printf ("I got: %d\n",n);
}