【发布时间】:2021-12-18 13:26:00
【问题描述】:
我一直在尝试将字符串转换为整数、浮点数和字符数组。虽然我可以让它适用于整数和浮点数,但字符有一些问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *s1;
int k, no=5;
char* variable = "R1,R2,R3,R4,R5";
void* value;
s1 = calloc(no,sizeof(char)*81);
for (k=0; k<no; k++) s1[k] = strdup(mchar);
ListChar(variable, s1, no, ",");
memcpy(value, s1, no*sizeof(char)*81);
free(s1);
int i;
for (i = 0; i < no; i++)
printf("%s", value[i]);
printf("\n");
return 0;
}
在我的头文件中
#define mchar "A...(81times)"
实施:
int ListChar(char *buf, char *list, int maxloop, char* delim)
{
int n = 0;
char *s,*t;
s= strdup(buf);
t= strtok(s,delim);
while ( t && (n<maxloop))
{
if (list!=NULL) list[n] =strdup(t);
n++;
t=strtok(NULL,delim);
}
free(s);
return(n);
}
在 calloc 内存分配期间,当我观看 s1 它的 0xsomeadress ""
在for循环之后s1变成0xsomeadress "Garbage value 81 times"
当s1 分配给list 时,它仍然读取相同的垃圾值。
而当list [n] = strdup(t)list[0]读取第一块垃圾值比如-21 '\221 ṗ'。
t 被正确分隔。我什至尝试初始化char *s1[81] = {"something"} 并在j 上循环它,但它不起作用,同样的问题,我需要在最后释放s1,因为这个函数运行了很多次。我通过list[n]=atoi(t) 为整数和浮点数做了它工作正常。谁能给我一些建议?
【问题讨论】:
-
并确保为所需的终止
'\0's预留空间 -
如果你用未初始化的
no调用calloc,结果可能是任何东西。strdup返回一个char *,您将其分配给s1[k],这是一个char,然后看起来像随机垃圾(因为指针值通常被视为整数)。在继续之前尝试启用编译器警告并修复它们。 -
你怎么知道这会失败?没有打印输出。请构造一个minimal reproducible example
-
如果您没有看到
s1[k] = strdup(mchar);的错误消息,请更改您的编译器设置,因为您正在浪费时间尝试运行不正确的代码 -
大家好,很抱歉定义中有错字,还有@klutt 我已经让我的代码可重现,因为之前它只是一个 sn-p
标签: arrays c string char delimiter