【发布时间】:2021-09-24 18:57:35
【问题描述】:
我很难通过 strtok 函数拆分从 C 编程语言文件中读取的句子。我从一个文件中扫描它并将其存储在一个变量 info 中,我需要从中分隔单词。我尝试了很多东西,最终从网上复制了一个代码并稍作改动。代码很好地分离了第一个标记,但是它写了一些废话。
#include <stdio.h>
#include <string.h>
void main()
{
//int i; //brojac
char info[]=""; // sve informacije, kasnije treba da bude u strukturi
FILE *pok;
pok=fopen("C:/Users/Trajkovici/Desktop/OsobeFajl.txt","r");
if(pok==NULL)
{
printf("Greška prilikom otvaranja datoteke!");
}
fscanf(pok,"%[^\n]",&info);
puts("INFO: ");
puts(info);
//fclose(pok);
char * token = strtok(info, " ");
// loop through the string to extract all other tokens
while( token != NULL )
{
puts("\nTOKEN:");
printf( " %s\n", token ); //printing each token
token = strtok(NULL, " ");
}
}
这是文件和结果: The result The file 顺便说一句,我编写了相同的代码,没有从文件中提取句子,而是手动声明它。它工作得很好。
#include<stdio.h>
#include <string.h>
int main() {
char string[] = "Sladjan Jankovic 46 Vranje";
// Extract the first token
puts(string);
char * token = strtok(string, " ");
// loop through the string to extract all other tokens
while( token != NULL )
{
printf( " %s\n", token ); //printing each token
token = strtok(NULL, " ");
}
return 0;
}
这是上面代码的结果: The result 所以,问题是我有两个具有完全相同变量的代码,但是其中一个可以很好地拆分为标记,而另一个则没有。关于第一个代码的任何帮助?
附:很抱歉可能缩进不好,这是我第一次在 Stack Overflow 上发帖。此外,文件中的一些 cmets 和行是塞尔维亚语。
【问题讨论】:
-
请将结果和输入数据作为文本而不是图像提供。将其直接粘贴到问题中。
-
char info[]=""这是一个单字节数组。不能在那里存储太多。任何试图写更多的代码,比如fscanf,都会导致未定义的行为。声明一个更大的数组,例如char info[128]; -
还有:尽量避免
strtok()接近不可用。 -
谢谢,我将数组的最大大小设置为 100(这并不重要),现在可以使用了。
-
不是你的主要问题,但是:大多数时候,阅读一行文本的好方法是使用
fgets。通常没有充分的理由像您一样使用fscanf("%[^\n]")。除此之外,fgets让你告诉它你的输入数组有多大(这样它就可以保证不会溢出它),但这也有助于提醒你分配足够大的空间,这是你的问题。