【发布时间】:2017-03-13 23:37:05
【问题描述】:
我正在努力实现的目标 -
输入:(假定为字符串字面量。)This is a string
输出:string a is This
我的幼稚解决方案:
将字符串文字复制到 char 数组。
char 数组 str[sizeofstring] 的当前内容:This is a string逐字反转数组并将其存储在另一个数组中。
char reverse[sizeofstring]:sihT si a gnirts从最后一个位置反向遍历数组到第 0 个位置。将其存储在 char 数组解决方案中。
字符解[sizeofstring]:string a is Thisstrcpy(pointertoachar, solution)。 - 因为函数需要返回一个指向char的指针。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverse(char *input) {
int n = strlen(input);
char str[n];
char reverse[n];
char solution[n];
char *solutionp = malloc(sizeof(char) * n);
strcpy(str, input);
int last = 0;
int i = 0;
int q = 0;
while (str[i] != '\0') {
if (str[i] == ' ') {
printf("i : %d\n", i);
printf("LAST:%d\n", last);
for (int t = (i - 1); t >= last; t--) {
reverse[q] = str[t];
q++;
}
last = i + 1;
reverse[q] = ' ';
q++;
}
i++;
}
// for the last word.
for (int cc = i - 1; cc >= last; cc--) {
reverse[q] = str[cc];
q++;
}
// Traversing from the last index to the first.
int ii;
int bb = 0;
for (ii = n - 1; ii >= 0; ii--) {
solution[bb] = reverse[ii];
bb++;
}
// This prints the right output.
// printf("%s\n",solution);
// Copying from a char array to pointer pointing to a char array.
strcpy(solutionp, solution);
return solutionp;
}
int main() {
char *str = "This is a string";
char *answer;
answer = reverse(str);
printf("%s\n", answer);
printf("\n");
return 0;
}
问题:
步骤 1 到 3 正在按预期工作。出于调试目的,我尝试打印包含解决方案的数组的输出并且它有效,但是当我使用 strcpy 将其复制到指针指向的 char 数组并返回指针时,它会打印垃圾值以及部分正确的输出.
输出:
字符串 a 是 This??Z??
第 4 步似乎有问题。我做错了什么?
【问题讨论】:
-
int n = strlen(input); char str[n];[...]strcpy(str,input);越界写入,未定义行为。 -
请记住,字符串必须为 NUL 终止字符留出空间。您的 str 变量短一个字节。
-
@BjornA。我尝试将 str[n]、reverse[n]、solution[n] 分别更改为 [n+1]。仍然输出相同。
-
@EOF 我还能在这里做什么?因为我不知道字符串文字的大小。
-
@BjornA。我对 c 很陌生,会检查那个选项。
标签: c arrays string pointers reverse