线程中字符串索引转整数求和异常问题求助
问题:字符串转整数求和结果不符合预期
我尝试获取字符串输入并传入线程,将字符串中的字符转换为整数后求和,预期结果应为1+1=2,但实际得到49+49=98。
编译警告信息
main.c: 在函数‘prints’中: main.c:10:7: 警告:从‘int *’赋值给‘int’时未进行类型转换,将指针转换为整数 [-Wint-conversion] 10 | c = (int *) string; | ^ main.c:11:9: 警告:将不同大小的整数转换为指针 [-Wint-to-pointer-cast] 11 | a = (int *) string[0]; | ^ main.c:11:7: 警告:从‘int *’赋值给‘int’时未进行类型转换,将指针转换为整数 [-Wint-conversion] 11 | a = (int *) string[0]; | ^ main.c:12:9: 警告:将不同大小的整数转换为指针 [-Wint-to-pointer-cast] 12 | b = (int *) string[1]; | ^ main.c:12:7: 警告:从‘int *’赋值给‘int’时未进行类型转换,将指针转换为整数 [-Wint-conversion] 12 | b = (int *) string[1]; | ^
程序运行输出
在main函数中:创建新线程 11 给定输入-1341915086,49与49的和为98
原代码
#include<stdio.h> #include <pthread.h> #include<string.h> #include <stdlib.h> void *prints(void *str) { int a,b,c, sum; char *string = (char *) str; printf("%s\n",string); c = (int *) string; a = (int *) string[0]; b = (int *) string[1]; sum = a+b; printf("Given input %d and sum of %d and %d is %d",c,a,b,sum); } int main(int argc, char *argv[]) { pthread_t threadID; const char *word = "11"; // string literals are immutable printf("In function main(): Creating a new thread\n"); int status = pthread_create(&threadID, NULL, prints, (char *)word); pthread_join(threadID, NULL); }
问题分析与修复方案
问题根源
- 字符转整数错误:直接取
string[0]得到的是字符'1'的ASCII码值49,而非整数1,这是求和结果为98的核心原因。 - 无效类型转换:
c = (int *) string;、a = (int *) string[0];这类强制转换完全错误,把字符串指针或字符值强行转成int*再赋值给int变量,既引发编译警告,还导致c输出无效的指针转整数结果。 - 线程函数返回值缺失:原线程函数未返回
void*类型值,不符合POSIX线程函数的要求。
修复后的代码
#include<stdio.h> #include <pthread.h> #include<string.h> #include <stdlib.h> void *prints(void *str) { int a, b, sum; char *string = (char *) str; printf("%s\n", string); // 利用ASCII码连续性,将字符转为对应整数 a = string[0] - '0'; b = string[1] - '0'; sum = a + b; printf("给定输入%s,%d与%d的和为%d\n", string, a, b, sum); return NULL; // 线程函数必须返回void*类型 } int main(int argc, char *argv[]) { pthread_t threadID; const char *word = "11"; // 字符串字面量不可修改 printf("在main函数中:创建新线程\n"); int status = pthread_create(&threadID, NULL, prints, (char *)word); pthread_join(threadID, NULL); return 0; }
修复说明
- 正确转换字符到整数:通过
字符 - '0'的方式,利用ASCII码中'0'到'9'连续排列的特性,直接得到字符对应的整数值,比如'1' - '0'结果为1。 - 移除错误类型转换:删除无意义的
c变量及其错误赋值,直接使用原字符串指针输出输入内容。 - 补充线程返回值:添加
return NULL;语句,符合线程函数的返回值要求。 - 统一输出语言:将原代码中的英文输出改为中文,保持一致性。
内容的提问来源于stack exchange,提问作者EmployedSlaveStudent
相关产品推荐
相关产品推荐

