【问题标题】:printf shows wrong output, strange question mark at the end of line [C]printf 显示错误输出,行尾出现奇怪的问号 [C]
【发布时间】:2018-12-21 11:31:32
【问题描述】:

这段代码试图执行队列,但队列有两个字段:数字和单词。我的问题是字段“word”打印不正确(字段“number”很好)

预期输出:

22 abc

12 效果

654 xyz

不幸的是输出看起来像这样

https://ibb.co/gjF446F

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

#define MAX_capacity 1000
#define Max_len_napis 100


typedef struct{
   int number;
   char word[];

} data;

data intArray[MAX_capacity];
int peak = 0;
int rear = -1;
int itemCount = 0;

int front() {
   return intArray[peak].number;
}

bool isEmpty() {
   return itemCount == 0;
}

bool isFull() {
   return itemCount == MAX_capacity;
}

int size() {
   return itemCount;
}  

void insert(data x) {

   if(!isFull()) {

      if(rear == MAX_capacity-1) { 
         rear = -1;            
      }       

      int indeks = ++rear;
      intArray[indeks].number = x.number;
      strcpy (intArray[indeks].word, x.word);

      itemCount++;
   }
}


data remove() {
   data dat = intArray[peak++];

   if(peak == MAX_capacity) {
      peak = 0;
   }

   itemCount--;
   return dat;  
}


void print(int N){


    for(int i=0;i<N;i++){
        data n = remove();           
      printf("%d\n",n.number);
      printf("%s\n",n.word); // that's line doesn't work correctly




    }



}


int main() {
   data tab[3];

   tab[0].number = 22;
   strcpy (tab[0].word, "abc");
   insert(tab[0]);

   tab[1].number = 12;
   strcpy (tab[1].word, "efg");
   insert(tab[1]);

   tab[2].number = 654;
   strcpy (tab[2].word, "xyz");
   insert(tab[2]);



   int siz = size();
   print(siz);





    return 0;



   }

我认为 printf("%s\n",n.word) 不能正常工作。但如果我不使用结构,一切正常。

【问题讨论】:

  • char word[]; 保留一个零字符数组。我确定这不是你想要的。
  • char word[] 是一个灵活的数组成员。你应该为它分配内存。

标签: c algorithm queue


【解决方案1】:

您需要为 word 分配内存。比如这样:

typedef struct{
   int number;
   char word[100];

} data;

更好的方法是动态地为 word 分配内存。

【讨论】:

  • 谢谢,它的作品!但为什么? word[] 有什么问题?
  • @Pawel, word[] 只​​要你不初始化它就会分配 0 个字节。 word[] 是定义灵活大小数组的方法。 “灵活”并不意味着如果您尝试向其中写入更多数据,数组会自动增长。灵活意味着编译器以防 word[]="hello" 将计算初始化字符串的长度并分配(6 字节)所需的内存量。
【解决方案2】:
#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h>
#include <string.h> 

#define MAX_capacity 1000
#define Max_len_napis 100


typedef struct{
   int number;
   char word[100];

} data;

data intArray[MAX_capacity];
int peak = 0;
int rear = -1;
int itemCount = 0;

int front() {
   return intArray[peak].number;
}

bool isEmpty() {
   return itemCount == 0;
}

bool isFull() {
   return itemCount == MAX_capacity;
}

int size() {
   return itemCount;
}  

void insert(data x) {

   if(!isFull()) {

      if(rear == MAX_capacity-1) { 
         rear = -1;            
      }       

      int indeks = ++rear;
      intArray[indeks].number = x.number;
      strcpy (intArray[indeks].word, x.word);

      itemCount++;
   }
}


data remove() {
   data dat = intArray[peak++];

   if(peak == MAX_capacity) {
      peak = 0;
   }

   itemCount--;
   return dat;  
}


void print(int N){


    for(int i=0;i<N;i++){
        data n = remove();           
      printf("%d\n",n.number);
      printf("%s\n",n.word); // that's line doesn't work correctly




    }



}


int main() {
   data tab[3];

   tab[0].number = 22;
   strcpy (tab[0].word, "abc");
   insert(tab[0]);

   tab[1].number = 12;
   strcpy (tab[1].word, "efg");
   insert(tab[1]);

   tab[2].number = 654;
   strcpy (tab[2].word, "xyz");
   insert(tab[2]);



   int siz = size();
   print(siz);





    return 0;



   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2021-08-27
    • 2012-01-30
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多