如何阻止字符串替换以前的元素?
How to stop string from replacing previous elements?
我正在尝试 运行 这个程序,该程序读取 str:int:int:int
类型的输入,然后将值拆分到各自的数组中。问题是每次函数 运行s 时字符串部分都会被替换。这是我的代码:
int main(){
char *str[100];
int stock[100][3],idp=0;
while(idp<100){
fgets(data,80,stdin);
str[idp]=strtok(data,":");
stock[idp][0]=atoi(strtok(NULL,":"));
stock[idp][1]=atoi(strtok(NULL,":"));
stock[idp][2]=atoi(strtok(NULL,":"));
idp++;
}
return 0;
}
运行使用输入 abc:3:4:5
abcde:1:5:6
def:5:6:7
将 while()
循环 3 次后,我得到以下值:
str[0]=def stock[0][0]=3 stock[0][1]=4 stock[0][2]=5
str[1]=def stock[1][0]=1 stock[1][1]=5 stock[1][2]=6
str[2]=def stock[2][0]=5 stock[2][1]=6 stock[2][2]=7
如您所见,虽然 stock[][]
数组的值已正确存储,但 str[]
数组中的所有先前字符串都已被替换。我想知道如何阻止这种情况发生。提前致谢。
在这些陈述中
fgets(data,80,stdin);
str[idp]=strtok(data,":");
指针str[idp]
总是设置为同一变量数据中的地址。所以变量在当前时刻存储的是指针指向的内容。
您必须复制指向的字符串。
那就是你需要声明一个二维字符数组,例如
char str[100][10];
然后写例如
strcpy( str[idp], strtok(data,":") );
你在做浅拷贝。你需要真正的副本。一种方法是使 str
成为类似于 char str[100][80]
的二维数组。然后代替这个
str[idp]=strtok(data,":");
这样做
strcpy(str[idp], strtok(data,":"));
此外,如果您的输入完全是那种格式,您可以使用 sscanf
而不是 atoi
s 和 strcpy
。像这样
sscanf(data, "%[^:]:%d:%d:%d", str[idp], &stock[idp][0], &stock[idp][1], &stock[idp][2]);
%[^:]
将读取非 :
.
的字符
我正在尝试 运行 这个程序,该程序读取 str:int:int:int
类型的输入,然后将值拆分到各自的数组中。问题是每次函数 运行s 时字符串部分都会被替换。这是我的代码:
int main(){
char *str[100];
int stock[100][3],idp=0;
while(idp<100){
fgets(data,80,stdin);
str[idp]=strtok(data,":");
stock[idp][0]=atoi(strtok(NULL,":"));
stock[idp][1]=atoi(strtok(NULL,":"));
stock[idp][2]=atoi(strtok(NULL,":"));
idp++;
}
return 0;
}
运行使用输入 abc:3:4:5
abcde:1:5:6
def:5:6:7
将 while()
循环 3 次后,我得到以下值:
str[0]=def stock[0][0]=3 stock[0][1]=4 stock[0][2]=5
str[1]=def stock[1][0]=1 stock[1][1]=5 stock[1][2]=6
str[2]=def stock[2][0]=5 stock[2][1]=6 stock[2][2]=7
如您所见,虽然 stock[][]
数组的值已正确存储,但 str[]
数组中的所有先前字符串都已被替换。我想知道如何阻止这种情况发生。提前致谢。
在这些陈述中
fgets(data,80,stdin);
str[idp]=strtok(data,":");
指针str[idp]
总是设置为同一变量数据中的地址。所以变量在当前时刻存储的是指针指向的内容。
您必须复制指向的字符串。
那就是你需要声明一个二维字符数组,例如
char str[100][10];
然后写例如
strcpy( str[idp], strtok(data,":") );
你在做浅拷贝。你需要真正的副本。一种方法是使 str
成为类似于 char str[100][80]
的二维数组。然后代替这个
str[idp]=strtok(data,":");
这样做
strcpy(str[idp], strtok(data,":"));
此外,如果您的输入完全是那种格式,您可以使用 sscanf
而不是 atoi
s 和 strcpy
。像这样
sscanf(data, "%[^:]:%d:%d:%d", str[idp], &stock[idp][0], &stock[idp][1], &stock[idp][2]);
%[^:]
将读取非 :
.