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


#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

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

(良心回答)

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

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

第二个字符串少一个字符是因为输入第一个字符串之后的回车键被第二个字符串当作字符输入了。你可以在CreaString()函数里加个判断来忽略回车键。

没有打印函数的实现?