C语言 如何在线程中进行字符串索引

vuv7lop3  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(120)

我尝试输入字符串,将它们发送到线程,然后将它们转换为整数并相加。我的结果应该是1+1 = 2。但我得到了49+49 = 98

main.c: In function ‘prints’:
main.c:10:7: warning: assignment to ‘int’ from ‘int *’ makes integer from pointer without a cast [-Wint-conversion]
   10 |     c = (int *) string;
      |       ^
main.c:11:9: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   11 |     a = (int *) string[0];
      |         ^
main.c:11:7: warning: assignment to ‘int’ from ‘int *’ makes integer from pointer without a cast [-Wint-conversion]
   11 |     a = (int *) string[0];
      |       ^
main.c:12:9: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   12 |     b = (int *) string[1];
      |         ^
main.c:12:7: warning: assignment to ‘int’ from ‘int *’ makes integer from pointer without a cast [-Wint-conversion]
   12 |     b = (int *) string[1];
      |       ^
In function main(): Creating a new thread
11
Given input -1341915086 and sum of 49 and 49 is 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);
}
6yt4nkrj

6yt4nkrj1#

我的结果应该是1+1 = 2,而不是49+49 = 98
字符'1'ASCII代码为0x3149十进制(请参见man ascii)。
您需要:

a = string[0] - '0';
  b = string[1] - '0';
  sum = a + b;

说明:字符'0''9'ASCII代码是连续的(以0x30开始,以0x39结束),因此使用'0'作为基数来确定给定数字的数值。

raogr8fs

raogr8fs2#

string[0] - '0'可以将字符符号转换为整数,这是你在考虑学习多线程之前应该学习的基础知识,或者你可以使用strtol函数将整个字符串转换为单个整数。
除此之外,问题是你正在做非常奇怪的强制转换和无效转换。语法方面,C允许各种各样的疯狂强制转换,但这并不意味着最终结果是定义良好的或可用的。

  • 这是无稽之谈,string是一个指向字符数组的char*。它可能没有对齐。如果你取消引用*c,你违反了“严格别名”。未定义的行为,任何事情都可能发生。
  • a = (int *) string[0];这是无意义的,因为string[0]char,而不是指针,很可能char的值在大多数系统上可以被重新解释为指针,但这样做是完全没有意义的。此外,你不能给int赋值一个指针,这样做是无效的C。也可能发生未定义的行为和任何事情或什么都不发生。
  • b = ...相同。
  • 您的函数必须为return,否则您也会在那里调用未定义的行为。

您可以通过监听编译器警告来避免所有类似的问题,或者更好的方法是将它们升级为错误,以便在第一时间阻止无效代码生成可执行文件。

相关问题