C中的字符串递增函数

String Incrementing Function in C

对于我的编程 class,我正在尝试编写一个函数 incrementstring(),它接受从驱动程序传入的字符串 'str',然后将其加一。它应该适用于字母和数字(例如,“1”变为“2”,'a' 变为 'b','z' 变为 'aa','ZZ' 转到 'AAA')。我几乎所有测试条件都有效,除了一个我似乎无法找到解决方法的错误。

这是我目前拥有的:

void incrementstring(char* str){
int i;
int j;
int length = strlen(str);
for(i = strlen(str)-1; i >= 0; i--){
    if (str[i] == '9'){
            str[i] = '0';
            if (str[0] == '0'){
                    for (j = strlen(str)-1; j>=0; j--){ //This loop is the problem
                            str[j+1] = str[j];
                            }
                    str[0] = '1';
                    }
    }
    else if (str[i] == 'z'){
            if (str[0] == 'z'){
                    str[i] = 'a';
                    str[i+1] = 'a';
                    }
            str[i] = 'a';
            }

    else if (str[i] == 'Z'){
            if(str[0] == 'Z'){
                    str[i] = 'A';
                    str[i+1] = 'A';
            }
            str[i] = 'a';
    }
    else{
            str[i]++;
            return;
    }

}
}

当我运行函数时,这是驱动程序输出的内容:

 1. testing "1"... = 2. Correct!
 2. testing "99"... = 100. Correct!
 3. testing "a"... = b. Correct!
 4. testing "d"... = e. Correct!
 5. testing "z"... = INCORRECT: we got "aa0". We should be getting "aa" instead.
 6. testing "aa"... = ab. Correct!
 7. testing "Az"... = Ba. Correct!
 8. testing "zz"... = aaa. Correct!
 9. testing "cw"... = cx. Correct!
 10. testing "tab"... = tac. Correct!
 11. testing "500"... = 501. Correct!

11 tests run.

我在第 9 行写了一个 for 循环来处理 '99' 到 '100' 的情况。它获取字符串的每个索引并将其向右移动一位,然后将“1”添加到字符串的开头。但是,由于某种原因,这个循环弄乱了第 5 个测试条件,如上所示。如果我取消循环,'99' 将变为 '00',但第 5 个测试将毫无问题地通过。我在这里碰壁了,我想知道是否有人可以提供一些见解。

非常感谢您的帮助,谢谢。

您的问题是您没有在驱动程序中以 NULL 结尾您的字符串。 运行 你的代码与我自己的驱动程序完美地工作,所以任何额外的帮助都需要你与我们分享你的驱动程序。

你所要做的就是,在用字符串填充 char * 之后,将下一个字符设为 '[=11=]' 字符。由于 strlen 函数只是遍历 char 的数组,直到它到达 NULL 终止字符,所以在使用它们之前必须终止所有带有该字符的字符串。

在跟踪字符串长度以确保您不会覆盖其分配的 space 的同时,为每个 if()if else 段添加一个空终止字符:

str[0] = '1';
str[1] = 0; 

...

str[i] = 'a';
str[i+1] = 0;

以此类推

最后的陈述可能没有达到您预期的效果。
我相信您想要做的是增加表达式以指向 str.
拥有的下一个内存元素 请记住 str 实际上不是数组。它是一个指针。 [...]
您使用的符号是 C 中提供的一种便利,允许像指针引用一样的数组。
因此,表达式 str[i] 也可以表示为 *(str + i)。 如果它是你想要的下一个内存位置(存储下一个 char 的位置),表达式将是: *(str + i++),当使用数组符号时转换为:str[i++]

将以下内容更改为

else{
        str[i]++;

至:

else{
        str[i++]=0;

它对 "zaz" 有效吗?