我的if陈述与我想要的相反

时间:2019-12-05 14:15:40

标签: c if-statement while-loop linked-list strcmp

我有一个程序,要求用户输入一个单词,然后将他们输入的每个单词添加到链接列表中。当用户输入"END"时,程序应列出所有节点。

我的问题是该程序仅将单词"END"添加到列表中,并且当用户输入其他内容时,将触发else条件:打印出列表中的所有项目,但所有这些单词只是"END"

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

struct node {
  char word[32];
  struct node *next;
};

int main() {
  struct node *head = NULL, *cur = NULL;
  char input[32];

  while(1) {
    cur = malloc(sizeof(struct node));

    printf("Enter words: ");
    scanf("%s", input);

    if (strcmp(input, "END") == 0) {
      cur->next = head;
      strcpy(cur->word, input);
      head = cur;
    } else {
      struct node *iter = head;

      while (iter != NULL) {
        printf("Contents: %s\n", iter->word);
        iter = iter->next;
      }
    }
  }
}

通过执行if语句来检查条件== 1是否仅使用户仅继续输入单词,无论用户输入了什么内容,例如"END"

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

if语句中的条件

if (strcmp(input, "END") == 0)

表示存储在数组input中的字符串等于字符串文字"END"。因此,如果数组包含字符串"END",那么您将在列表中插入一个新节点。

此外,您还必须在此检查之后而不是在此之前为新节点分配内存。否则会有内存泄漏。

请注意您存在无限循环。

您需要释放所有分配的内存。

似乎您是说类似以下内容

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

#define N   32

struct node 
{
    char word[N];
    struct node *next;
};

int main(void) 
{
    struct node *head = NULL;
    char input[N];

    printf( "Enter words: " );

    while ( scanf( "%31s", input ) == 1 )
    {
        char tmp[N];

        size_t i = 0;

        while ( ( tmp[i] = toupper( ( unsigned char )input[i] ) ) != '\0' ) ++i;

        if ( strcmp( tmp, "END" )  == 0 ) break;

        struct node *current = malloc( sizeof( struct node ) );
        strcpy( current->word, input );
        current->next = head;
        head = current;
    }

    for ( struct node *current = head; current != NULL; current = current->next )
    {
        printf( "%s -> ", current->word );
    }

    puts( "NULL" );

    while ( head != NULL )
    {
        struct node *current = head;
        head = head->next;
        free( current );
    }

    return 0;
}

程序输出看起来像

Enter words: Jackson Jake Hello end
Hello -> Jake -> Jackson -> NULL

答案 1 :(得分:1)

首先,需要在比较不为零时使用END将字符串添加到列表中,直到输入字符串为strcmp() != 0

第二,创建当前的cur节点,其中包含新的字符串,需要使用尾部指针添加新的字符串,如下所示,使用next节点。另外,对于节点,您需要确保head始终位于列表的开头。

第三,成功打印列表后,您需要break,否则将永远结束while(1)循环。

int main() {
  struct node *head = NULL, *next = NULL, *cur = NULL;
  char input[32];

  while(1) {
    printf("Enter words: ");
    scanf("%s", input);

    if (strcmp(input, "END") != 0) {
      cur = malloc(sizeof(struct node));
      cur->next = NULL;
      strcpy(cur->word, input);
      if (head == NULL) {
        head = cur;
        next = head;
      }
      next->next = cur;
    } else {
      struct node *iter = head;
      while (iter != NULL) {
        printf("Contents: %s\n", iter->word);
        iter = iter->next;
      }
      break;
    }
 }