1

当我尝试在结构中存储和打印字符串时,我的代码出现问题。

我在这里提取了代码的基本部分:

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

struct post                 
{
    char name[30];          
    int tel;            
    struct post *next;      
};

typedef struct post Post;

Post *head = NULL;      
Post *current;              

Post* CreateList(char tempname[30], int temptel);

Post* CreateList(char tempname[30], int temptel)
{   
    Post *ptr = (Post*)malloc(sizeof(Post));

    strcpy(ptr->name, tempname);    
    ptr->tel = temptel;
    ptr->next = NULL;

    printf("\n creating list with headnode as [%s]\n",tempname);

    head = current = ptr;
    return ptr;
}

int main()
{
    char tempname[30];
    int temptel;

    Post * ptr;

    printf("[Name] [Number] = ");
    scanf("%s %d", &tempname[30], &temptel);
    CreateList(tempname, temptel);
}

在 main 中,您应该插入名称和编号,并在 CreateList 中创建链表的第一个节点。当我尝试打印带有名称的字符串时,会出现一些垃圾,但数字打印得很好。

我怀疑 tempname 并没有真正从 main 发送到 CreateList,即使我试图将它作为函数中的参数发送。我也尝试打印存储在结构中的名称:

    printf("\n creating list with headnode as [%s]\n",ptr->name);

但这也失败了。

因此,当我尝试打印名称时出现问题,但由于我尝试了很多打印方法(使用 strcpy()、strncat()、strdup()),我开始怀疑我从未真正存储ptr->name 中的字符串。所以我要么打印错误,要么存储错误。

对于解决此问题的任何帮助或提示,我将不胜感激!提前致谢。

4

3 回答 3

1

当你这样做时:

scanf("%s %d", &tempname[30], &temptel);

作为开始写入的地址,您正在传递字符串最后一个元素之后的内存位置字符串的最后一个元素是tempname[29])。这也意味着您将在分配的内存之外进行写入,从而导致危险行为。相反,您应该传递字符串的第一个字符的地址,即:

scanf("%s %d", &(tempname[0]), &temptel);

或更简单地说:

scanf("%s %d", tempname, &temptel);

我还建议您将数组大小定义为常量,并将所有的替换30为常量名称。

#define MY_STRING_SIZE 30
于 2013-07-04T22:28:11.033 回答
1

你有一个错误:

scanf("%s %d", &tempname[30], &temptel);

应该:

scanf("%s %d", &tempname[0], &temptel);

目前,您的输入存储在tempname最后一个内存地址之后。

于 2013-07-04T22:35:32.463 回答
0

正如其他人已经指出的那样,一个大错误是让scanf() 写在数组的末尾tempname,而不是写在数组中。

但是我应该补充一点,通过将scanf() 的调用更改为类似

scanf("%29s %d", tempname, &temptel);

然后使用以下语句确保字符串将以空值结尾。

tempname[29]='\0';

但还有更多:"%s"不允许您在名称中包含空格。

您还应该检查scanf() 的返回值,以查看字符串和数字是否都已成功转换(顺便说一下,名称中的空格会阻止您转换数字,并且可能会将输入缓冲区留在不一致的状态)。

scanf() 是一个强大的功能,但使用起来绝对不是小菜一碟。你应该彻底阅读它的文档。

于 2013-07-05T01:29:50.030 回答