Ob1Do. 2022-01-31 01:49 采纳率: 50%
浏览 44
已结题

求解答为什么会在最后打印少一位


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

//串的结构体定义
typedef struct{
    char *ch; 
    int length;
}SqString;

//函数原型声明
void InitString(SqString &S);
void CreatString(SqString &S,int n);
void PrintString(SqString S);

int main(void){
    
    SqString S,T;
    
    InitString(S);
    InitString(T);
    
    CreatString(S,10);
    printf("\n");
    CreatString(T,4);
    printf("\n");
    
    PrintString(S);
    PrintString(T);
    
    return 0;
}

void InitString(SqString &S){
    S.ch=(char*)malloc(sizeof(char)*256);
    S.length=0;
}

void CreatString(SqString &S,int n){
    int i;
    for (i=0;i<n;i++){
        scanf("%c",&S.ch[i]);
    }
    S.length=i;
}

img

就是这样一个情况,求解答,谢谢!

  • 写回答

3条回答 默认 最新

  • jxwd 新星创作者: C/C++技术领域 2022-01-31 15:39
    关注

    (良心回答)

    img

    参照着上图,先给你指出问题,再对你提出几点建议哈,仅供参考:
    1、首先,你在输入第一个字串之后,输入了一个回车符,它被你的第二个SqString.ch在调用scanf的时候接收掉了。所以你的第二个字串就少了一个字符(准确来说,是那个\n将你的字串的位置给挤掉了)
    2、其次,你的字串的末尾没有'\0'呦。如果你用%s打印的话,假如你的编译器对语法检测比较严格的话,是会打印出乱码的。你可以向上面一样在末尾给它加上一个'\0'。
    所以,你之所以打印的两个字串不在同一行,实际上就是这个'\n'导致的。这也就解释通了。要不然就会成这样。(如下图)
    3、这个问题的解决方法其实很简单,你可以直接用一个比如getchar();卡在中间,然后让其接受掉这个'\n'就行了。(不过你最好还要打印一个'\n'出来)(如下图)

    img

    img


    在此,对您提出几点建议,仅供参考:
    1、您C和C++混用了。引用(就是SqString& S)是C++里的内容,可以通篇都是C写的,因为如果用C++就不用定义结构体这么麻烦了。一般不建议这么做(如果是题目给的那也没办法哈)。
    2、还有就是注意代码风格的严谨呦,字串后面的'\0'不要忘喽。
    还有就是,您好像没有给我PrintString的实现方式,所以我就直接按照这样的方式打印喽(如下图)。如果是用for循环,那确实可以不用'\0',但是这里您写的是字串,最好还是加上。

    img

    如果还有什么没明白的,或者是我没有说清楚的,欢迎在下方评论。
    望采纳哈!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 已采纳回答 2月1日
  • 修改了问题 1月31日
  • 创建了问题 1月31日