在C中计算标量积和字符串操作

问题描述 投票:0回答:2

对于我的作业,我需要做一个程序:

  1. char获取2个字符串(scanf格式,最多100个字符),(例如:{1,2,3,4}和{0,1,2,0})
  2. 取空​​格之间的数字(我现在正在使用strtok
  3. 将它们转换为double(我正在使用strtod
  4. 做标量产品

在复制我的实际代码之前,我想问你们,如果你们知道如何轻松地学习这种类型的操作;我的考试就是这样,拿字符串做事,解析他们转换它们,但是我很难学习如何。那个男人和我的书都是简化的,我无法理解。

感谢所有人,我希望你能在我疯狂之前帮助我。

  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>

  //TODO TAKE ARGOMENTS
  //TODO EXTRACT THE NUMBERS
  //TODO CONVERT THEM TO DOUBLE
  //TODO DO THE SCALAR PRODUCT

  //prototypes:

  unsigned manipulate_string(char vet[100]);

  //functions:

  unsigned manipulate_string(char vet[100]){
      const char s[4] = " ,{}";
      double vfinal[100];
      char *token;
      char *stringPtr;
      char *todPtr

      //get the first token

     token = strtok(vet, s);

     //walk through other tokens
     while( token != NULL ) {
         printf( " %s\n", token );

         token = strtok(NULL, s);

         double d = strtod(vet, &stringPtr);
         vfinale[100]=d

         return d;
     }
}

 int main () {
     char vet1[100];
     char vet2[100];
     double vet1f[100];
     double vet2f[100];
     const char s[4] = " ,{}";
     char *token;
     printf("inseert first vector\n");
     scanf("%[^\n\r]", vet1);
     printf("insert second vector\n");
     scanf("%[^\n\r]", vet2);

     vet1f[100]=manipulate_stringvet1[100]);
     vet2f[100]=manipulate_string(vet2[100]);

     printf("the first one is\n",vet1f);
     printf("the second one is\n",vet2f);


}

现在代码只是关于看到字符串被操纵,之后,不要以为我会有问题去做一个做标量产品的函数。

再次感谢您的帮助和浪费时间。

c parsing split string-formatting
2个回答
1
投票

您的代码中存在很多问题:

  • 一些变量拼写错误:vfinal // vfinale
  • 一些分号丢失:char *todPtr
  • 一些括号丢失了:vet1f[100]=manipulate_stringvet1[100]);

但是,即使纠正了这些小问题,也需要了解数组操作:

  • double vfinal[100];宣布100个double阵列
  • qazxsw poi将数组的第101个元素的值设置为qazxsw poi:您尝试在数组外部写入。

在这些行中你有同样的问题(4次):

vfinale[100] = d;

你有另一个问题:函数d不是你想要的:你只能返回一个vet1f[100]=manipulate_string(vet1[100]); vet2f[100]=manipulate_string(vet2[100]); 而你想要的是修改manipulate_string(或unsigned char)数组(应该作为参数传递)


如果我们采用这段代码:

vet1f

我们可以看到两个问题:

  • 首先,vet2f位于循环内部,在读取最后一个标记之前退出
  • 在循环块中(在 token = strtok(vet, s); while( token != NULL ) { token = strtok(NULL, s); double d = strtod(vet, &stringPtr); vfinale[100]=d return d; } 之间),您使用前一个读取新标记,因此: 第一个令牌丢失了 当return d;将是{}时,它将被传递给token并且它不是你想要的。

大多数编译器可以启用它们的警告,尝试使用NULL(GCC,clang,icc ...)或/ W4(visual studio)


0
投票

即使我修复了问题,也只有一件我无法理解的事情:为什么strtod没有转换我的字符串..这是修复的代码

strtod

输出:

-Wall
© www.soinside.com 2019 - 2024. All rights reserved.