gpt4 book ai didi

c++ - 由不同分隔符分隔的 char 数组中的递增数字

转载 作者:搜寻专家 更新时间:2023-10-31 00:13:12 25 4
gpt4 key购买 nike

我有这样的字符串 1-2,4^,14-56
我期待输出 2-3,5^,15-57

char input[48];
int temp;
char *pch;

pch = strtok(input, "-,^");

while(pch != NULL)
{
char tempch[10];
temp = atoi(pch);
temp++;
itoa(temp, tempch, 10);
memcpy(pch, tempch, strlen(tempch));
pch = strtok(NULL, "-,^");
}

如果我打印 input 运行完之后,它只打印 2,这是更新字符串的第一个字符。它不会打印字符串中的所有字符。我的代码有什么问题?

最佳答案

对于纯 C,使用库函数 strtod。除了 atoi 之外,这可以更新指向下一个未解析字符的指针:

long strtol (const char *restrict str, char **restrict endptr, int base);
...
The strtol() function converts the string in str to a long value. [...] If endptr is not NULL, strtol() stores the address of the first invalid character in *endptr.

由于数字之间可能有多个“非数字”字符,使用库函数 isdigit 跳过它们。我把它放在循环的开头,这样它就不会意外地将 -2,3 之类的字符串转换为 -1,4 - 初始 - 2 将首先被拾起! (如果这是其他地方的问题,还有一个 strtoul。)

由于您似乎希望将结果放入 char 字符串中,因此我使用 sprintf 将输出复制到缓冲区中,该缓冲区必须足够大以容纳您可能的输入 < em>plus 由十进制溢出引起的额外字符。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>

int main (void)
{
char *inputString = "1-2,4^,14-56";
char *next_code_at = inputString;
long result;
char dest[100], *dest_ptr;

printf ("%s\n", inputString);

dest[0] = 0;
dest_ptr = dest;
while (next_code_at && *next_code_at)
{
while (*next_code_at && !(isdigit(*next_code_at)))
{
dest_ptr += sprintf (dest_ptr, "%c", *next_code_at);
next_code_at++;
}
if (*next_code_at)
{
result = strtol (next_code_at, &next_code_at, 10);
if (errno)
{
perror ("strtol failed");
return EXIT_FAILURE;
} else
{
if (result < LONG_MAX)
dest_ptr += sprintf (dest_ptr, "%ld", result+1);
else
{
fprintf (stderr, "number too large!\n");
return EXIT_FAILURE;
}
}
}
}
printf ("%s\n", dest);

return EXIT_SUCCESS;
}

样本运行:

Input:  1-2,4^,14-56
Output: 2-3,5^,15-57

关于c++ - 由不同分隔符分隔的 char 数组中的递增数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27660427/

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