gpt4 book ai didi

c - 字符串操作 - 奇怪的字符

转载 作者:太空宇宙 更新时间:2023-11-04 06:29:17 26 4
gpt4 key购买 nike

描述:

我使用 fgets() 读取用户输入(例如“ls -l/”)并调用 Parse() 以供以后使用(“ls”“-l”“\”)。

问题是:第一个周期的标记中有奇怪的字符(下面的屏幕截图),但从那以后输出就没问题了。我试图用零初始化两个缓冲区,但行为没有变化。请解释我的第一个输出中发生了什么。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/times.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>

typedef char* string;
char inputBuffer[512];
string parse[256];
int j,parseCount;
void Parse(void);


void Parse(void)
{
char buffer[512];
string token;
token = " ";
strcpy(buffer, inputBuffer);
j=0;
parse[j] = strtok (buffer, token);
while (parse[j] != NULL)
{
j++;
parse[j] = strtok (NULL, token);
}
parseCount =j;
}

int main (void)
{
printf(">> ");
fgets(inputBuffer, 512, stdin); /* input buffer, max.Input(char), whereFrom?*/
Parse();
for (j=0;j<parseCount;j++){
printf("[%d] %s\n",j, parse[j]);
}
return main();
}

output

最佳答案

这一行

parse[j] = strtok (buffer, token); 

将内存地址存储在 buffer 中,这是 Parse() 的本地地址。表示 buffer 的内存在 Parse() 返回时失效,因此当尝试被取消引用以打印它们所引用的内容。

为了解决这个问题,让调用函数创建一个临时工作缓冲区并将对它的引用传递给 `Parse():

char * parse[256] = 0;
char buffer[512] = "";
size_t parseCount = 0;

void Parse(char * buffer)
{
const char * token = " ";
size_t j = 0;
parse[j] = strtok(buffer, token);
while (parse[j] != NULL)
{
j++;
parse[j] = strtok(NULL, token);
}
parseCount = j;
}

int main(void)
{
fgets(buffer, 512, stdin);
{
char buffer_tmp[512];
strcpy(buffer_tmp, buffer);
Parse(buffer_tmp);

for (size_t j = 0; j < parseCount; j++)
{
printf("[%zu] %s\n", j, parse[j]);
}
}
return 0;
}

因为我不喜欢全局变量,所以我更喜欢以下内容:

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

size_t parse(char * buffer, char ** parse)
{
const char * token = " ";
size_t j = 0;
parse[j] = strtok(buffer, token);
while (parse[j] != NULL)
{
j++;
parse[j] = strtok(NULL, token);
}
return j;
}

#define IN_MAX (512 + 1 + 1)

int main(void)
{
char buffer[IN_MAX] = "";

if (NULL != fgets(buffer, IN_MAX, stdin))
{
char buffer_tmp[IN_MAX];
strcpy(buffer_tmp, buffer);

{
size_t parse_count = 0;
char * parse[IN_MAX/2 + 1] = 0;
size_t parse_count = parse(buffer_tmp, parse);

for (size_t j = 0; j < parse_count; j++)
{
printf("[%zu] %s\n", j, parse[j]);
}
}
}
else if (ferror())
{
fprintf(stderr, "Error reading from inout stream.\n");
}

return 0;
}

关于c - 字符串操作 - 奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22534419/

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