gpt4 book ai didi

c - 获得意外的错误输出

转载 作者:行者123 更新时间:2023-11-30 18:11:31 24 4
gpt4 key购买 nike

使用以下标准编写此方法..

输入:aabbb 输出:a2b3

输入:ab 输出:ab(因为它比a1b1短)

输入:a23 输出:错误(不读取数字)

这是我当前的方法。

void encrypt(char* crypt, const char* source) {


while (1) {

char tmp = *source;

if (!tmp) {
*crypt = 0;
printf("error\n");
return;
}

size_t count = 1;
while (*(++source) == tmp){
if(isdigit(tmp)){
printf("error\n");
return;
}
++count;
}
*(crypt++) = tmp;
crypt += sprintf(crypt, "%zu", count);
}

}

int main(int argc, char **argv) {

if (argc != 2) {
fprintf(stderr, "error\n");
return 1;
}

const char* source = argv[1];

char* crypt = malloc(strlen(source)*2+1);

encrypt(crypt, source);
printf("%s\n", crypt);
// free(crypt);
return 0;

}

非常奇怪的是,每次运行这个程序时,我都会得到输出:

./prog abbbb
error
a1b4

./prog a23r
error
a1

为什么会出现这个错误?如何才能使第一条错误消息停止出现,以及为什么当输入字符串中间有数字时程序不会中断?

最佳答案

第一种情况:abbbb

您调用函数encrypt() ,它准备字符串 a1b4在您分配的缓冲区中(sprintf()发生在内存中并且不会导致控制台上显示任何内容)。

字符串以空终止符终止。当循环到达此点时 tmp 将为空。不幸的是,这会导致一条即时消息 error打印在控制台上。然后函数返回,并打印缓冲区中的结果。

第二种情况:a23r

首先,encrypt()开始解析输入字符串并为有效字母创建输出字符串。这会产生 a1 。在第二次迭代时,它遇到数字 '2' ,这会导致 isdigit(tmp)是真实的。同样,立即输出 error到控制台。然后该函数返回。但是a1已经在缓冲区中,因此它也会输出到控制台。

如何以正确的顺序获得事物?

更改您的函数以便通知调用者错误情况。例如,返回 0 表示正常,另一个值表示发生错误。

#define ERR_EMPTY   1         /* error: empty string */
#define ERR_INVALID 2 /* error: invalid character */

int encrypt(char* crypt, const char* source) {
int rc = 0; // return= 0;

if (!*source) // if input string is empty
rc = ERR_EMPTY;
else {
while (*source) { // loop while the char is not zero
char tmp = *source;
// (don't show a error at the null terminator)
if(isdigit(tmp)){
rc = ERR_INVALID;
break;
}
size_t count = 1;
while (*(++source) == tmp){
++count;
}
*(crypt++) = tmp;
crypt += sprintf(crypt, "%zu", count);
}
}
*crypt = 0; // prevent risks: in every case put a null terminator
return (rc);
}

通过此更改,您可以更好地控制 main() 中的输出:

int err = encrypt(crypt, source);
if (!err)
printf("%s\n", crypt);
else printf ("Error (code %d)\n", err);

最后一句话

注意:malloc(strlen(source)*2+1)假设 strlen(source)<(SIZE_MAX-1)/2 。如果不满足此条件,您可能会遇到整数溢出,从而导致分配不足和内存损坏。

关于c - 获得意外的错误输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46592447/

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