c语言-数据结构C语言字符串的输出时总是少输出最后一个字符,这是怎么回事啊?

问题描述

数据结构C语言字符串的输出时总是少输出最后一个字符,这是怎么回事啊?

代码如下:
#include
#include
struct SeqString
{
int MAXNUM;//字符串的最大个数
int n;//字符串的长度
char c;//存储基地址
};
typedef struct SeqString *PSeqString;
PSeqString CreatNullStr(int m);
void InitStr(PSeqString pstr);
/
***主函数****/
int main()
{
int m;
PSeqString pstr;
printf("设置字符串最大个数MAXNUM:");
scanf("%d",&m);
pstr=CreatNullStr(m);
InitStr(pstr);
return 0;
}
PSeqString CreatNullStr(int m)
{
PSeqString pstr=(PSeqString)malloc(sizeof(struct SeqString));
if(pstr!=NULL)
{
pstr->c=(char *)malloc(sizeof(char)*m);
if(pstr->c)
{
pstr->n=0;
pstr->MAXNUM=m;
return pstr;
}
else free(pstr);
}
printf("!!!");
return NULL;
}
void InitStr(PSeqString pstr)
{
int i,n;
char ch;
PSeqString p=pstr;
printf("字符串初始长度n,(注意:初始字符串长度不大于MAXNUM):n请输入:");
scanf("%d",&n);//n表示长度
printf("字符串输入:");
for(i=0;i
{
ch=getchar();
p->c[i]=ch;
p->n=p->n+1;
}
printf("初始后的元素输出:");
for(i=0;in;i++)
printf("%c",p->c[i]);
}
运行结果,最后一个字符总是输不出来,救救小白!!!

解决方案

printf("初始后的元素输出:");有换行吗?没有。所以,你第一个getchar()读入的是回车。在scanf()输入4的时候,你是输入了4后按了下回车。
这时候回车依然留在了输入流中,当你输入ghjk的时候,实际在输入流中的是 nghjk 这五个键,第一个是回车,所以最后一个错了。只需要在scanf输入后加个getch();即可解决

解决方案二:

意思就是这样:
printf("字符串输入:");
getchar();//这行加上去

解决方案三:

你的InitStr函数有问题,

    for(i=0;i<n;i++) {
      ch=getchar();
      p->c[i]=ch;
      p->n=p->n+1;
     }

调试的时候发现i=0的时候没有有效执行

时间: 2024-10-03 01:09:40

c语言-数据结构C语言字符串的输出时总是少输出最后一个字符,这是怎么回事啊?的相关文章

pat-PAT1009 c语言字符串问题 我写的程序输出时起始位置会多一个空格,如何改正才能没有空格

问题描述 PAT1009 c语言字符串问题 我写的程序输出时起始位置会多一个空格,如何改正才能没有空格 #include #include int main(){ int i,j=0,m,k=0; char sen[100]; char s[10][20]; gets(sen); m=strlen(sen)+1; for(i=0;i<m;i++){ if(sen[i]==''){ s[j][k]=''; k=0; j++; } if(sen[i]==' ') { s[j][k]=''; k=0;

c语言-数据结构C语言版10道实习题目求解答!!

问题描述 数据结构C语言版10道实习题目求解答!! 除有特别说明外,每个题目请以自然语言.形式化表述(伪码.流程图等).程序代码三种方式描述. 顺序结构线性表LA与LB的节点关键字为整数.LA与LB的元素按非递减有序,线性表空间足够大.试给出一种高效算法,将LB中的元素合并到LA中,使新的LA元素仍保持非递减有序.高效是指最大限度的避免移动元素. 请写一个算法将线性表(a1,a2,-,an)逆置为(an,an-1,-,a1). 在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,

数据结构c++语言-数据结构C++语言解决迷宫问题

问题描述 数据结构C++语言解决迷宫问题 标题: 迷宫问题 时 限: 100000 ms 内存限制: 100000 K 总时限: 3000 ms 描述: 迷宫问题 迷宫是一个二维矩阵,其中1为墙,0为路,3为入口,4为出口.要求从入口开始,从出口结束,按照 下,左,上,右 的顺序来搜索路径. 输入: 迷宫宽度w 迷宫高度h 迷宫第一行 迷宫第二行 ... 迷宫第h 行 输出: 入口横坐标1 入口纵坐标1 横坐标2 纵坐标2 横坐标3 纵坐标3 横坐标4 纵坐标4 ... 横坐标n-1 纵坐标n-

数据结构c语言-数据结构 C语言版 二叉树

问题描述 数据结构 C语言版 二叉树 先根次序访问,后根次序访问,与先序遍历,中序遍历,后序遍历,有什么区别与联系啊 解决方案 这是数据结构里的基础知识啊童鞋!树不是有左子树.右子树和根吗,遍历都是先左子树后右子树,先序.中序和后序是相对于根来说的,所以先根次序.后根次序就是先序.后序遍历的意思,先序遍历:根-左子树-右子树中序遍历:左子树-根-右子树后序遍历:左子树-右子树-根 解决方案二: 先根次序访问就是先序后根次序访问就是后续 对于一个最简单的二叉树abc先序就是先访问a,顺序为abc中

c语言-难道输入字符串之后不是按回车输出么,为什么只是换行了

问题描述 难道输入字符串之后不是按回车输出么,为什么只是换行了 #include "stdio.h" #include "string.h" #include "ctype.h" #define MAXN 5000 + 10 char buf[MAXN], s[MAXN]; int p[MAXN]; int main() { int n,m=0,max=0,x,y; int i,j; fgets(buf,sizeof(s),stdin); n =

数据结构C语言实现之二叉树

#include <stdio.h>#include <stdlib.h>#define STACK_MAX_SIZE 30#define QUEUE_MAX_SIZE 30#ifndef elemType typedef char elemType;#endif /************************************************************************//* 以下是关于二叉树操作的11个简单算法 *//***********

C语言数据结构:表达式求值代码问题

问题描述 C语言数据结构:表达式求值代码问题 要求允许小数,过滤空格,可以+ - * /和求指数 #include #include #include #include #define true 1 #define false 0 #define OPSETSIZE 8 //运算符集合数为8 char OPSET[OPSETSIZE] = { '+', '-', '*', '/', '(', ')', '#', '^' }; unsigned char Prior[8][8] = { /****

数据结构C语言实现之线性表

#include <stdio.h>#include <stdlib.h>typedef int elemType; /************************************************************************//* 以下是关于线性表顺序存储操作的16种算法 *//************************************************************************/struct Lis

iOS开发系列--C语言之数组和字符串

概览 数组在C语言中有着特殊的地位,它有很多特性,例如它的存储是连续的,数组的名称就是数组的地址等.而在C语言中是没有String类型的,那么如果要表示一个字符串,就必须使用字符数组.今天主要就介绍如下三个方面: 一维数组 多维数组 字符串 一维数组 一维数组操作比较简单,但是需要注意,数组长度必须是固定的,长度不能使用变量进行初始化:如果声明的同时进行赋值则数组长度可以省略,编译器会自动计算数组长度:同时数组不能先声明再一次性赋值(当然可以对每个元素一一赋值). #include <stdio