strcpy(char*,char a[]) 给出了错误的输出。 (逐字反转字符串)
strcpy(char*,char a[]) is giving incorrect output. (Reversing a string word by word)
我想要达到的目标 -
输入:(假设为字符串文字。)This is a string
输出:string a is This
我天真的解决方案:
将字符串文字复制到字符数组。
char 数组 str[sizeofstring] 的当前内容:This is a string
逐字反转数组存入另一个数组
char reverse[sizeofstring]: sihT si a gnirts
从最后一个位置到第0个位置反向遍历数组。将其存储在 char 数组解决方案中。
字符解[sizeofstring]: string a is This
strcpy(pointertoachar, solution)
。 - 因为函数需要 return 一个指向 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] != '[=10=]') {
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
和 return 指针将其复制到指针指向的 char 数组时,它会打印垃圾值以及部分正确的输出。
OUTPUT:
string a is This??Z??
第4步好像有问题,我哪里做错了?
您代码中的主要问题是您分配的临时缓冲区太短了一个字节。您必须为字符串末尾的最后一个 '[=11=]'
字节留出足够的空间。
您可以使用辅助函数以相反的顺序复制块来简化代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverse_block(char *dest, const char *src, int len) {
for (int i = 0; i < len; i++) {
dest[i] = src[len - i - 1];
}
dest[len] = '[=10=]';
return dest;
}
char *reverse_words(const char *string) {
int i, last;
int len = strlen(string);
char temp[len + 1];
for (i = last = 0; i < len; i++) {
if (string[i] == ' ') {
// copy the word in reverse
reverse_block(temp + last, string + last, i - last);
temp[i] = ' ';
last = i + 1;
}
}
// copy the last word in reverse
reverse_block(temp + last, string + last, len - last);
// allocate an array, reverse the temp array into it and return it.
return reverse_block(malloc(len + 1), temp, len);
}
int main(void) {
const char *string = "This is a string";
printf("%s\n", string);
char *solution = reverse_words(string);
printf("%s\n", solution);
free(solution);
return 0;
}
现在您可以通过实现一个函数来进一步改进代码,该函数可以原地反转块。有了这个,你不再需要一个临时缓冲区,你可以直接在字符串副本上工作,它简化了代码。
我想要达到的目标 -
输入:(假设为字符串文字。)This is a string
输出:string a is This
我天真的解决方案:
将字符串文字复制到字符数组。
char 数组 str[sizeofstring] 的当前内容:This is a string
逐字反转数组存入另一个数组
char reverse[sizeofstring]:sihT si a gnirts
从最后一个位置到第0个位置反向遍历数组。将其存储在 char 数组解决方案中。
字符解[sizeofstring]:string a is This
strcpy(pointertoachar, solution)
。 - 因为函数需要 return 一个指向 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] != '[=10=]') {
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
和 return 指针将其复制到指针指向的 char 数组时,它会打印垃圾值以及部分正确的输出。
OUTPUT:
string a is This??Z??
第4步好像有问题,我哪里做错了?
您代码中的主要问题是您分配的临时缓冲区太短了一个字节。您必须为字符串末尾的最后一个 '[=11=]'
字节留出足够的空间。
您可以使用辅助函数以相反的顺序复制块来简化代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverse_block(char *dest, const char *src, int len) {
for (int i = 0; i < len; i++) {
dest[i] = src[len - i - 1];
}
dest[len] = '[=10=]';
return dest;
}
char *reverse_words(const char *string) {
int i, last;
int len = strlen(string);
char temp[len + 1];
for (i = last = 0; i < len; i++) {
if (string[i] == ' ') {
// copy the word in reverse
reverse_block(temp + last, string + last, i - last);
temp[i] = ' ';
last = i + 1;
}
}
// copy the last word in reverse
reverse_block(temp + last, string + last, len - last);
// allocate an array, reverse the temp array into it and return it.
return reverse_block(malloc(len + 1), temp, len);
}
int main(void) {
const char *string = "This is a string";
printf("%s\n", string);
char *solution = reverse_words(string);
printf("%s\n", solution);
free(solution);
return 0;
}
现在您可以通过实现一个函数来进一步改进代码,该函数可以原地反转块。有了这个,你不再需要一个临时缓冲区,你可以直接在字符串副本上工作,它简化了代码。