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

时间:2018-09-11 09:44:00

标签: c parsing split string-formatting

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

  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);


}

现在,代码仅用于查看操作的字符串,之后,不要以为执行标量乘积的函数就没问题了。

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

2 个答案:

答案 0 :(得分:1)

您的代码中有很多问题:

  • 某些变量的拼写错误:vfinal // vfinale
  • 缺少一些分号:char *todPtr
  • 缺少一些括号:vet1f[100]=manipulate_stringvet1[100]);

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

  • double vfinal[100];声明了一个由100个double
  • 组成的数组
  • vfinale[100] = d;将数组的第 101th 元素的值设置为d:您尝试在数组之外进行写操作。

您在这些行中有相同的问题(4次):

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时,它将传递给strtod,这不是您想要的。

大多数编译器都可以启用警告,请尝试使用-Wall(GCC,clang,icc ...)或/ W4(Visual Studio)

答案 1 :(得分:0)

即使我解决了问题,也有一点我无法理解:为什么strtod不能转换我的字符串。这是已修复的代码

#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


//prototipi

unsigned manipulate_string(char vet1[], char vet2[]);
//funzioni

unsigned manipulate_string(char vet1[], char vet2[]){
  const char s[4] = " ,{}";
  double vfinale1[100];
  double vfinale2[100];
  char *token1;
  char *token2;
  char *stringPtr1;
  char *stringPtr2;
  int c1=0, c2=0;

//get the first token

token1 = strtok(vet1, s);

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

   token1 = strtok(NULL, s);

}


token2 = strtok(vet2, s);

while( token2 != NULL ) {
   printf( "%s\n", token2);

   token2 = strtok(NULL, s);
}

 double d = strtod(vet1, &stringPtr1);
 vfinale1[c1]=d;

 double u = strtod(vet2, &stringPtr2);
 vfinale1[c2]=u;

 return *vfinale2;
 return *vfinale1;
}


int main(int argc, char const *argv[]){
   char vet1[100];
   char vet2[100];
   double vfinale2[100];
   double vfinale1[100];

   printf("insert first vector\n");
   scanf("%[^\n\r]", vet1);
   printf("insert second vector\n");
   scanf(" %[^\n\r]", vet2);

   manipulate_string(vet1, vet2);


   printf("the first one is %.2f\n", *vfinale1);

   printf("the second one is %.2f\n", *vfinale2);

}

输出:

insert first vector
1,2,3,4
insert second vector
5,6,7,8
 1
 2
 3
 4
 5
 6
 7
 8
 the first one is 0.00
 the second one is 0.00