【问题标题】:return each word of a string into a linked list将字符串的每个单词返回到链表中
【发布时间】:2021-12-28 18:12:09
【问题描述】:

我想将字符串 i 中的每个单词都返回到一个节点中,但一开始它不起作用,但它会自动添加一些奇怪的字符,我想知道为什么如果有人能告诉我如何修复它。

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


typedef struct listeMots{

    char val[20];
    struct listeMots *next;
}listeMots;



listeMots motsDe(char* t);



int main()
{
char* t;
t = "this is a test but it is bugging  ";

  listeMots nchlh;
  nchlh = motsDe(t);  




    return 0;
}


listeMots motsDe(char* t){
 int i=0 ,j=0;
 char* temp;
 
    listeMots *tete = malloc(sizeof(listeMots));
   listeMots *ptr = tete;
   while (t[i] != '\0')
   {
       if('a'<=t[i] && t[i]<='z' ){          
           ptr->val[j] = t[i];
           
           i++;
           j++;
        
       }
       else if (t[i] == ' '){
           j = 0;
           
           printf("%s -->",ptr->val);
           ptr->next = malloc(sizeof(listeMots));
           ptr = ptr->next;
           i++;
       }
       else{
           j= 0;
            printf("%s -->",ptr->val);

           ptr->next = malloc(sizeof(listeMots));
           ptr = ptr->next;
           ptr->val[0] = t[i];
           printf("%s -->",ptr->val);
           ptr->next = malloc(sizeof(listeMots));
           ptr = ptr->next;
       }
   }
return *tete;
}

我真的看不出错误在哪里,我知道我很接近但我现在还是有点迷路

【问题讨论】:

  • if('a' &lt;= t[i] &lt;= 'z' ) 是正确的语法,但并不像您想的那样 - C 不像数学表达式那样编写。请尝试if('a' &lt;= t[i] &amp;&amp; t[i] &lt;= 'z' )。或者更简单的if(islower(t[i]))
  • listeMots *tete ; 你永远不会分配给这个。你是说listeMots tete ; 吗?
  • 谢谢你们让我注意到 2 个错误现在它有点工作但输出有点奇怪,它添加了一些奇怪的字符我将编辑我的代码并向你展示它是如何的
  • 确保使用\0终止字符串。
  • 在检查空间的 else 块中,在重置变量 j 之前,您应该执行 ptr-&gt;val[j] = '\0'; ,以便正确终止单词。此外,在您的第二个 else 块中,您没有增加变量 i,需要这样做。

标签: c linked-list


【解决方案1】:

OP 发布的代码有问题。

  1. 关于:listeMots motsDe(char* t) 函数:motsDe() 返回一个指针,而不是结构的实例,所以签名应该是:listeMots * motsDe(char* t)

  2. next 字段(在链表的最后一个结构上应包含 NULL,而不是内存中的垃圾。要解决此问题,建议将所有对 malloc() 的调用替换为对 calloc() 的调用 注意有一个不同的参数列表,它将所有字段初始化为'\0'。作为一个很好的副作用,在对printf()的调用中不再打印垃圾字符

  3. 建议跟踪单词中的字符数,以确保 20 字节数组:val[] 不会溢出。

  4. 强烈建议注意代码缩进。建议每个缩进级别为 4 个空格

  5. temp 变量未使用,建议删除该声明。

  6. 建议添加:#include &lt;ctype.h&gt;,以便您可以使用 isalpha() 等函数。

  7. 关于您对 ? 等字符的问题,建议您直接跳过它们。

  8. 关于如下语句:ptr-&gt;next = malloc(sizeof(listeMots)); 对于健壮的代码,强烈建议检查 (!=NULL) 返回值(以确保操作成功) 如果不成功 (==NULL),则输出是一种很好的编程习惯, stderr,相应的错误消息,类似于:perror( "malloc for instance of struct listeMots failed" );,然后释放分配的内存,然后调用 exit( EXIT_FAILURE ); 注意:exit()EXIT_FAILUREstdlib.h 头文件中定义。

  9. 由于分配的内存尚未返回给操作系统,因此发布的代码泄漏内存,建议在退出之前,遍历链表并将每个指向已分配内存的指针传递给free()函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2019-08-25
    • 2020-10-10
    • 2018-09-15
    相关资源
    最近更新 更多