簡體   English   中英

C語言中奇怪的printf輸出

[英]Strange printf output in C

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

char * reverse(char *string);
int main(int argc, char *argv[])
{
    char array[10];
    array[0] = 'a';
    array[1] = 'b';
    array[2] = 'c';
    array[3] = 'd';
    array[4] = 'e';
    printf("1%s\n",array);
    char *p = reverse(array);
    printf("4%s\n",p);
    printf("5%s\n",array);
}

char * reverse(char *string)
{
    int size = strlen(string);
    char reversed[size];
    int i;
    int j = 0;
    for(i = size-1; i >= 0; i--)
    {
        reversed[j] = string[i];
        j++;
    }
    printf("2%s\n",reversed);
    string = reversed;
    printf("3%s\n",string);
    return reversed;
}

這段代碼基本上只是初始化一個值數組,然后將其傳遞給反轉這些值的方法。

我不確定這是否是執行任務的最佳方法,因為我是C語言中的指針和數組的新手。

但是真正的問題是這樣的:

任何人都可以找出原因

printf("4%s\n",p);

如果您刪除前面的“ 4”,則看起來像這樣

printf("%s\n",p);

該行根本不會打印?

您要在函數reverse中返回指向局部變量( reversed )的指針,實際上該問題應該是: Why did it work in the first place?

此代碼string = reversed; 只會復制該指針,再復制該指針的本地副本,因此它不會在函數外部起作用。

要反轉一個字符串,您不需要額外的內存-這可以就地完成。

C中的字符串必須以空字符結尾。 您在非以null終止的字符串上使用strlen。

此外,您只是一個非常幸運的人,因為您的代碼存在嚴重問題:您忘記在字符串的末尾添加\\0符號。

UPD:主要問題是代碼行char reversed[size]; 這是一個常規的局部變量,具有自動持續時間,這意味着它在調用函數時就存在,而在函數返回時就消失(請參閱此鏈接)

您需要將其更改為:

char *reversed = malloc((size+1)*sizeof(char));

UPD-2:另一個錯誤修復是:

1)添加array[5] = '\\0'; 在所有其他數組初始化行之后

2)添加reversed[j] = '\\0'; 之后for...loop

for(i = size-1; i >= 0; i--)
{
    reversed[j] = string[i];
    j++;
}
reversed[j] = '\0';

UPD-3:但通常,它將以適當的方式更正確地初始化您的字符串:

char array[10] = "abcde";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM