- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
编辑 2:好的,我所做的只是将 surname[i] 指向的 char 的 malloc 更改为 50 字节,我的程序工作正常。谁能解释为什么?我认为这是因为 strtok 返回一个指向大于 16 字节的字符串的指针,我试图将该字符串分配给动态分配的 16 字节数组。谢谢。我正在尝试解析文件中的一行并将它们存储到 3 个并行数组中。我正在阅读的文本文件中有这个:
赖安,伊丽莎白 O.\n 麦金太尔,O.J.\n Cauble-Chantrenne, Kristin K.\n Larson, Lois F.\n Thorpe, Trinity R.\n 鲁伊斯,佩德罗 M.\n
每个人的格式是姓氏、名字/首字母和中间名首字母我有 3 个并行数组:char **surname、char **first 和 char *middle_init我已经检查过我对 Fgets 的调用是否有效。我的算法是先将每一行存储到 surname[i] 中,然后将其解析为其组件,然后再放入 3 个并行数组中。
问题:我的程序有效,但出于某种原因,它不适用于“Cauble-Chantrenne,Kristin K”。当我打印出 surname[2] 和 first[2] 时,我得到:圣歌克里斯特·拉尔森
int main(int argc, char *argv[]) {
char **surname, **first;
char *middle_init;
int num_people;
FILE *fp = fopen(argv[1], "r");
fscanf(fp, "%d", &num_people);
surname = (char**)malloc(sizeof(char*) * num_people);
first = (char**)malloc(sizeof(char*) * num_people);
middle_init = (char*)malloc(sizeof(char) * num_people);
read_names(fp, num_people, surname, first, middle_init);
fclose(fp);
printf("%s\n", surname[2]);
printf("%s\n", first[2]);
sort(num_people, surname, first, middle_init);
write_names(num_people, argv[2], surname, first, middle_init);
return 0;
}
有人可以告诉我我的问题是什么吗?谢谢你!!!我确定我的问题与我的这部分代码有关。附言据我所知,strtok 返回一个指向 token 的指针并自动放置一个'\0',对吗?为什么 first[2] 不是 Kristin?它显然由 2 个分隔符分隔,即“”<- 空格。太感谢了!!非常感谢这段时间。
while(fgets(surname[i], 80, fp) != NULL) {
surname[i] = strtok(surname[i], ",");
if (strlen(surname[i]) >= 16) {
surname[i][15] = '\0';
}
first[i] = strtok(NULL, ". ");
if (strlen(first[i]) >= 16) {
first[i][15] = '\0';
}
middle_init[i] = *(strtok(NULL, ". "));
i++;
}
我的所有其他功能都运行良好,我的错误只是在将文件中的数据读入 3 个数组时出错。谢谢!
最佳答案
您需要将一个临时缓冲区传递给 fgets
,因为 strtok
会截断原始字符串。因此,通过使用一个单独的字符串来保存读取的行,您将防止意外的结果切断源字符串。
此外,您的 if
语句看起来很奇怪。您要截断 16 个字节的字符串,这可能是您想要做的,但在此代码块中执行此操作似乎很奇怪。
关于c - 不太确定为什么 strtok 没有按照我想要的方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26009679/
我正在寻找将数组中的单词与另一个数组中的字典中的单词进行比较,以查找找到的最大单词数 我使用了 strtok,因为两者中的单词都是用空格分隔的,但它不起作用。我需要你的帮助,请 void cherc
我在这个程序上花了几个小时,并花了几个小时在网上搜索我的方法的替代方案,但整个晚上都被崩溃和错误所困扰…… 我有几件事想用这段代码实现。首先我会解释我的问题,然后我会发布代码,最后我会解释我对这个程序
我希望使用 strtok() 解析以下字符串。 DINNER;NME=Tom Johnson;ADRES=1234 Street;TIME="12:00","15:00":Formal 有没有一种方法
这个问题在这里已经有了答案: Nested strtok function problem in C [duplicate] (2 个答案) 关闭 6 年前。 我意识到标题令人困惑,想不出更清晰的措
只是为了好玩,我正在编写一个程序,它将接受用户输入的字符串(甚至可能是文本文档)并打乱字符串中的单词。 我正在尝试使用 strtok 函数来分隔字符串中的每个单词。目前我觉得我当前的 strtok 实
如果我欺骗了主题,我真的很抱歉,我在这里搜索它没有结果。 我有代码 void split(char* str, char* splitstr) { char* p; char sp
strtok() 函数使用静态变量。 因此它不是可重入的。并且不能用于解析多个字符串。 我想知道的是为什么 strtok() 是这样设计的? strtok_r() 应该是 strtok()。 这个函数
我是 C 编程的新手,目前正在努力使用 strtok。我想使用以下代码将一个字符串拆分为两个字符串(字符串是例如“Bat1:185”,分隔符是冒号): char batName[13]; char b
我正在写一个 C 程序来研究函数的用法 strtok() .这是我的代码: #include #include main() { char abc[100] = "ls &"; c
我正在尝试分割以下类型的行: GM 1 2 3 ! this is a comment 分离出评论部分。有几种可能的注释分隔符:!、' 和 #。 strtok 是明显的解决方案: card->card
我需要将 C 字符串划分为标记。我认为 strtok 将是我最好的尝试,但我得到了非常奇怪的结果...... 这是我的测试程序。在这个例子中,我将得到 3 个带有“##”分隔符的 token ,但是当
我正在使用库的 strtok(...) 并且它似乎工作正常,直到结束条件,导致段错误和程序崩溃。 API 声称 strtok(...) 将在找不到更多标记时输出 NULL,这意味着,我认为,您必须捕获
我有包含歌曲详细信息的链接列表,想要比较两个歌曲名称...附加任务是通过比不同单词更多的相似单词来比较它们...我使用 strtok 逐字获取它,然后检查如果当前单词包含在另一个名称中...但是当我这
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我尝试编写一个函数,该函数获取指向字符数组的指针,从用户读取字符串并删除字符串开头的所有空格,直到出现第一个不是字符串的字符。最后返回开头不带空格的字符串副本。 例如, 对于输入abcd,函数应返回指
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
当我尝试分离 token “(555) 333-444”时,下面的代码没有给出所需的输出。我需要函数来分别分离所有这些 555、333、444。我的错误可能是什么? 输出: 555 333-444 #
这个问题已经有答案了: How does strtok() split the string into tokens in C? (16 个回答) 已关闭 7 年前。 抱歉,这可能是一个愚蠢的问题,但
#include #include #include #define MAX_INPUT_LENGTH 1024 char *readline(FILE* fp, int max_length)
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是一名优秀的程序员,十分优秀!