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" 有效吗?
对于我的编程 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" 有效吗?