"olleH dlroW" 这是我的代码: #include #include char * reverseWo-6ren">
gpt4 book ai didi

c - strcat 将垃圾添加到字符串中

转载 作者:行者123 更新时间:2023-12-04 12:40:47 25 4
gpt4 key购买 nike

我试图在不改变单词顺序的情况下颠倒一个句子,

例如:"Hello World"=> "olleH dlroW"

这是我的代码:

#include <stdio.h>
#include <string.h>

char * reverseWords(const char *text);
char * reverseWord(char *word);

int main () {
char *text = "Hello World";
char *result = reverseWords(text);
char *expected_result = "olleH dlroW";
printf("%s == %s\n", result, expected_result);
printf("%d\n", strcmp(result, expected_result));
return 0;
}

char *
reverseWords (const char *text) {
// This function takes a string and reverses it words.
int i, j;
size_t len = strlen(text);
size_t text_size = len * sizeof(char);
// output containst the output or the result
char *output;

// temp_word is a temporary variable,
// it contains each word and it will be
// empty after each space.
char *temp_word;

// temp_char is a temporary variable,
// it contains the current character
// within the for loop below.
char temp_char;

// allocating memory for output.
output = (char *) malloc (text_size + 1);

for(i = 0; i < len; i++) {

// if the text[i] is space, just append it
if (text[i] == ' ') {
output[i] = ' ';
}

// if the text[i] is NULL, just get out of the loop
if (text[i] == '\0') {
break;
}

// allocate memory for the temp_word
temp_word = (char *) malloc (text_size + 1);

// set j to 0, so we can iterate only on the word
j = 0;

// while text[i + j] is not space or NULL, continue the loop
while((text[i + j] != ' ') && (text[i + j] != '\0')) {

// assign and cast test[i+j] to temp_char as a character,
// (it reads it as string by default)
temp_char = (char) text[i+j];

// concat temp_char to the temp_word
strcat(temp_word, &temp_char); // <= PROBLEM

// add one to j
j++;
}

// after the loop, concat the reversed version
// of the word to the output
strcat(output, reverseWord(temp_word));

// if text[i+j] is space, concat space to the output
if (text[i+j] == ' ')
strcat(output, " ");

// free the memory allocated for the temp_word
free(temp_word);

// add j to i, so u can skip
// the character that already read.
i += j;
}

return output;
}

char *
reverseWord (char *word) {
int i, j;
size_t len = strlen(word);
char *output;

output = (char *) malloc (len + 1);

j = 0;
for(i = (len - 1); i >= 0; i--) {
output[j++] = word[i];
}

return output;
}

问题是我用 <= PROBLEM 标记的行, 在本例中是“你好”的第一个词,它做的一切都很好。

在本例中是“World”的第二个词,它将垃圾字符添加到 temp_word ,我用 gdb 检查过它, temp_char不包含垃圾,但当strcat运行,最新的字符附加到 temp_word会像 W\006 ,

它附加\006到第二个单词中的所有字符,

我在终端上看到的输出很好,但打印出 strcmp并划分resultexpected_result返回 -94 .

  • 可能是什么问题?
  • \006 是什么?性格?
  • 为什么 strcat添加它?
  • 如何防止这种行为?

最佳答案

strcat() 需要“C”字符串第一个字符的地址,实际上是 char 数组,至少有一个元素等于 '\0'.

temp_word指向的内存和&temp_char指向的内存都不能满足这样的要求。

由于这个臭名昭著的未定义行为被调用,从那时起任何事情都可能发生。

一个可能的解决方法是改变

      temp_word = (char *) malloc (text_size + 1);

成为

      temp_word = malloc (text_size + 1); /* Not the issue but the cast is 
just useless in C. */
temp_word[0] = '\0';

还有这个

        strcat(temp_word, &temp_char);

成为

        strcat(temp_word, (char[2]){temp_char});

其余代码可能还有其他问题。

关于c - strcat 将垃圾添加到字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59533719/

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