You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

线程中字符串索引转整数求和异常问题求助

问题:字符串转整数求和结果不符合预期

我尝试获取字符串输入并传入线程,将字符串中的字符转换为整数后求和,预期结果应为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);
}

问题分析与修复方案

问题根源

  1. 字符转整数错误:直接取string[0]得到的是字符'1'的ASCII码值49,而非整数1,这是求和结果为98的核心原因。
  2. 无效类型转换:c = (int *) string;、a = (int *) string[0];这类强制转换完全错误,把字符串指针或字符值强行转成int*再赋值给int变量,既引发编译警告,还导致c输出无效的指针转整数结果。
  3. 线程函数返回值缺失:原线程函数未返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:30:41