对于我的作业,我需要做一个程序:
从char
中获取2个字符串(scanf
格式,最多100个字符)(例如:{1,2,3,4}和{0,1,2,0 })
取空格之间的数字(我现在正在使用strtok
)
将它们转换为double
(我正在使用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
//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);
}
现在,代码仅用于查看操作的字符串,之后,不要以为执行标量乘积的函数就没问题了。
感谢您的帮助和时间的浪费。
答案 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