【问题标题】:Splitting a sentence using STRTOK in C在C中使用STRTOK拆分句子
【发布时间】: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 让你告诉它你的输入数组有多大(这样它就可以保证不会溢出它),但这也有助于提醒你分配足够大的空间,这是你的问题。

标签: c string function strtok


【解决方案1】:
char info[]="";

将只分配一个元素。在

中使用它
fscanf(pok,"%[^\n]",&info);

是危险的,因为当读取具有正长度的字符串时,它会越界写入。 (即使是一个字符的字符串也太长了,因为必须有一个终止的空字符)。

分配足够的元素,例如(例如):

char info[102400]="";

并指定要读取的最大长度(限制必须最多为缓冲区大小减一以终止空字符)以防止缓冲区溢出,如下所示:

fscanf(pok,"%102399[^\n]",info);

还请注意,您应该在 info 之前删除 &amp;。表达式中的数组(除了一些例外)会自动转换为其第一个元素的指针。添加&amp; 将让它传递一个指向数组的指针,而%[ 需要一个指向字符的指针。将类型错误的数据传递给fscanf() 会调用未定义的行为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多