gpt4 book ai didi

c - 学习c从strtok中获取位置指针作为int

转载 作者:行者123 更新时间:2023-11-30 17:47:51 25 4
gpt4 key购买 nike

这里是初学者,对练习有些困惑: Tutorial页面上的最后一个(是德语)。我应该阅读 HTML-Lines 并打印属性及其值。给出了应该使用的函数的声明。
有两件事让我恼火:
1. 该行存储在 const char 字符串中,但我希望用户输入他想要的 HTML 行。似乎不可能在运行时更改 const 变量。在不改变给定声明的情况下如何实现?
2.教程希望我以整数形式返回 strtok-search 的位置,但我在网上读到该值存储在 strtok 中,有没有办法转换它,或者以某种方式获取它?

为了解决这个练习,我编写了这段代码,但程序在运行时崩溃,并显示“段错误(核心转储)”消息,我不知道为什么,有人可以向我解释一下吗? (我可能需要 malloc,但是对于哪个变量?)

//cHowTo Uebung Teil 2 Nr. 4
//HTMLine.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//char getHTMLline ();
int getHtmlAttributes(const char *string, int start, char *attrNamem,char *attrValue); //given by Tutorial

int main(int argc, char *argv) //because i want user-input later on, if possible
{
const char strg[]= {"<img src=\"kurt.jpg\" width=\"250\" alt=\"Kurt Kanns\" />"}; //given example line by tutorial
char attriN[255]={0}, attriV[255]={0};
int pos=99;
//printf("Please type the tag for analysis.\n");
//fgets(strg, 255, stdin);
printf("attribute\tvalue\n\n");
do
{
pos = getHtmlAttributes(strg, pos, attriN, attriV); //pos should be strtok-search-position
printf("%s\t\t%s\n", attriN, attriV);
}
while(pos!=1);
return EXIT_SUCCESS;
}

int getHtmlAttributes(const char *string, int start, char *attrNamem, char *attrValue)
{
int i, len;
char *ptr;
len = strlen(string);
char stringT[len]; //variable used to be split by strtok


for(i=0; i<len; i++)
stringT[i]=string[i];//copy string to stringT
if(start==99)
ptr = strtok(stringT, "<="); //get first attribute as whole
else
ptr = strtok(NULL, "= "); // get following attributes
for(i=0; i<len; i++)
attrNamem[i] = ptr[i];

ptr = strtok(NULL, "\""); //get values

for(i=0; i<len; i++)
attrValue[i] = ptr[i];

if(ptr == NULL) //if search complete
{
return 1;
}
else // if search continues
{
return 0;
}

}

//char getHTMLline ()
//{
// char user_input;
// scanf("%s", &user_input);
// return user_input;
//}

最佳答案

什么strtok()所做的是,如果您使用不同于 NULL 的字符串来调用它它在内部存储指向该字符串的指针并返回第一个标记。随后调用 NULL然后使用内部存储的指针来确定下一个标记。

现在你的代码中发生的是:当您调用getHtmlAttributes()时第一次创建给定 string 的副本在stringT并将该副本传递给 strtok() 。下次您调用strtok( NULL, ... ) 。我们有两个错误:

  1. 要复制的循环 string()stringT()是不正确的。你不复制终止'\0' 。只需使用 strcpy()在这种情况下
  2. 重要的一点:当您调用getHtmlAttributes()时第二次,您调用strtok( NULL, ... )stringT 的生命周期最初被调用的内容已以 getHtmlAttributes() 的第一次调用结束返回,因为stringT是每次调用函数时都会在堆栈上重新创建的局部变量。你可以通过以下任一方式解决这个问题
    • 声明 static char stringT[N]其中 N 必须是常量(如 255),不能使用 len (无论如何应该是len+1)在这种情况下
    • 创建 string 的动态分配副本通过char *stringT = strdup( string ); 。仅当您调用 strtok( stringT, ... ) 时,请这样做之后,请注意,如果没有额外的代码,您就会出现内存泄漏,因为您无法再次释放该内存。
    • 我更喜欢什么:使用 string直接代替stringT 。在这种情况下,您不应声明 string作为 const 并创建 strg 的副本在main()您传递给函数的内容

编辑我认为请求“以整数形式返回 strtok-search 的位置”意味着,您应该返回找到的标记在完整字符串中的偏移量。如果您使用建议的解决方案static char stringT[N],那么这很容易实现。从上面:如strtok()在收到 ptr 后,对第一次调用传递的字符串进行处理与NULL不同,可以计算并返回int offset = ptr - stringT;

编辑2

现在完全不同了

我刚刚阅读了您链接到的教程(来自黑森州的问候:-)),我认为这个想法是使用新的 strtok()每次调用该函数时都会循环。可能是这样的:

int getHtmlAttributes(const char *string, int start, char *attrName, char *attrValue)
{
char *buf;
char *attrptr;
char *ptr;

// copy the substring starting at start to buf
// you should add error checking (buf may become NULL)
buf = strdup( string+start );

// first step: tokenize on whitespace; we stop at the first token that contains a "="
for( attrptr = strtok( buf, " \t" ); attrptr && (ptr = strchr( attrptr, '=' )) != NULL; attrptr = strtok( NULL, " \t" ) ) ;

if( attrptr ) {
// copy everything before "=" to attrName
sprintf( attrName, "%.*s", ptr-attrptr, attrptr );
// copy everything after "=" to attrValue
strcpy( attrValue, ptr+1 );

// the next start is the current start + the offset of the attr found
// + the length of the complete attr
start += (attrptr - buf) + strlen( attrptr );
free( buf );
return start;
} else {
// no more attribute
free( buf );
return -1;
}
}

关于c - 学习c从strtok中获取位置指针作为int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18785580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com