gpt4 book ai didi

C 字符串输入溢出其他字符串输入

转载 作者:行者123 更新时间:2023-11-30 16:54:01 26 4
gpt4 key购买 nike

我正在做一个简单的控制台类型的命令系统,输入命令会扫描一个整数,然后会扫描一个字符串,但是第二个字符串的内容溢出了原始字符串

while (exit == 0) {
scanf("%s", input);

if (strcmp(input, "parent") == 0) {
free(input);
ptemp = malloc(sizeof(node_p));

printf("Id: ");
scanf("%d", &ptemp->itemid);
printf("\nElement:");
scanf("%s", ptemp->element);

add_parent_node(parent, ptemp->itemid, ptemp->element);

free(ptemp);
}
}

ptemp 是指向包含以下内容的结构的指针:

int itemid;
char *element;

我尝试过使用具有预定义大小的数组,但似乎没有任何效果...

最佳答案

某人发表的关于没有溢出的评论是正确的。你缺少的是(用外行人的话来说)对角色的保留。将某些内容声明为 char* 而不是 char[xx] 意味着您已准备好引用允许您使用字符进行操作的另一部分内存。为了简单起见,我重写了您的代码,以便您的程序可以运行。请记住,此代码依赖于用户输入长度小于 100 到 200 个字符的字符串。如果您需要更多字符,请随意增加方括号中的数字。

我还制作了一个 add_parent_node 函数来验证数据处理是否有效。

如果您想变得有点偏执,并且您觉得 scanf 的系统实现很奇怪,那么您可以将以下内容放在 while 语句下:

memset(ptemp,0,sizeof(ptemp));

它的作用是用空字符淹没整个结构。这意味着 itemid 的值将为零,因为零为空,而 element 将是 200 个空字符。

代码如下:

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

typedef struct{
int itemid;
char element[200]; //fixed array of chars to actually store a string
}mycollection;

void add_parent_node(char* parentnodename,int itemid,char* element){
printf("Added node as follows\n");
printf("Parent: %s\n",parentnodename);
printf("Item ID: %d\n",itemid);
printf("Element: %s\n\n",element);
}

int main(){
char input[100]; //limit command to 99 characters
mycollection ptemp[1];
while(1){ //while(1) = endless loop
printf("\nEnter command: ");
scanf("%s", input);
if (strcmp(input, "parent") == 0) {
printf("\nId: ");
scanf("%d", &ptemp->itemid);
printf("\nElement:");
scanf("%s", ptemp->element);
add_parent_node("im_the_parent", ptemp->itemid, ptemp->element);
}
if (strcmp(input, "exit") == 0) {
return 0; //return 0 = exit
}
}
}

关于C 字符串输入溢出其他字符串输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40668998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com