尝试使用指针访问字符串数据时,C程序不打印文本

Sat*_*ato 0 c arrays string pointers char

我正在通过KN King的"C编程:现代方法".该程序取自项目1b的"第12节 - 指针和数组".粗略地说,目标是:编写一个读取消息的程序,然后打印消息的反向.将消息存储在数组中,并使用指针跟踪数组中的当前位置.

目前,我只是试图在我尝试向后打印之前正常打印消息.我很沮丧,因为我的printMessage()函数与此处的 print_message()函数是1:1 ,但是当程序运行并输入一些文本时,它只打印出一个空白行.如果printMessage()的for循环中的行更改为'printf("%c",*p);则会发生这种情况.同样.

这是我的代码:

#include <stdio.h>

#define MAX_MESSAGE_LENGTH 100

int readMessage(char msg[]);
void printMessage(char msg[], int len);

/* finish later
 void printMessageReversed(char msg[], int len); */

int main(void){
    int msg_length;
    char c[MAX_MESSAGE_LENGTH];

    printf("Enter a message: ");
    msg_length = readMessage(c);

    printf("Length: %d", msg_length);

    printf("\nMessage: ");
    printMessage(c, msg_length);

    return 0;
}

int readMessage(char msg[]){
    int i;
    for(i = 0; (*msg = getchar()) != '\n'; i++);
    return i;
}

void printMessage(char msg[], int len){
    char *p;

    for(p = msg; p < msg + len; p++){
        putchar(*p);
    }
}
Run Code Online (Sandbox Code Playgroud)

想知道是否有人可以帮助确定我的问题?我确信这是一种痛苦明显或天真的东西,我只是想念.谢谢你的帮助.

Kei*_*son 9

int readMessage(char msg[]){
    int i;
    for(i = 0; (*msg = getchar()) != '\n'; i++);
    return i;
}
Run Code Online (Sandbox Code Playgroud)

每个字符都分配给*msg(等效于msg[0]).该msg指针从不更新也不会被编入索引i,所以你永远其初始元件指向的数组中的值分配给剩余的字符msg.

更换*msgmsg[i]是一个部分解决方案.请注意,这仍然不会写入null '\0'终止符msg,因此该msg数组不包含字符串.但是因为你的printMessage函数不需要字符串(它需要一个len参数),所以这并不是绝对必要的.尽管如此,如果您打算以其他方式对阵列进行操作,那么将其终止是一个好主意.

另外,正如chux在注释中指出的那样,如果在getchar()返回EOF之前返回,则会有一个无限循环'\n'(在Unix上,如果你在一行中间键入Ctrl-D两次,或者如果你正在从一个文件中读取,则会发生这种情况),它没有防止缓冲区溢出的保护.