當未連接的代碼行被取消註釋時,為什麼這個 C 程序會檢測到字符串中的兩個 '\0' 字符?

洪水

我目前正在學習 C,我編寫了這個程序來檢查 '\0' 字符是否真的在字符串的末尾,如“K 和 R”中所指出的。

我得到了最奇怪的結果。

如果我評論“int lista[] = {0, 1, 2, 3, 4};” 程序外的語句(這是一個與該程序的其他語句無關的語句,它是我將要進行的另一個測試的一部分)。程序的輸出結果如何,檢測到一個以字符串結尾的 '\0' 字符。但是,如果我不註釋該語句,程序輸出將檢測到字符串末尾的兩個 '\0'字符。為什麼會發生這種情況?

這是語句未註釋的程序:

#include <stdio.h>

int main(void)
{
    int lista[] = {0, 1, 2, 3, 4};
    char string[] = "linhas";
    
    for (int i = 0; i <= sizeof(string); i++)
    {
        if (string[i] != '\0')
        {
            printf("%c\n", string[i]);
        }
        else
        {
            printf("this dawmn null char\n");
        }
    }
}

這輸出:

l
i
n
h
a
s
this dawmn null char
this dawmn null char

這是該行註釋掉的程序:

#include <stdio.h>

int main(void)
{
    /*int lista[] = {0, 1, 2, 3, 4};*/
    char string[] = "linhas";

    for (int i = 0; i <= sizeof(string); i++)
    {
        if (string[i] != '\0')
        {
            printf("%c\n", string[i]);
        }
        else
        {
            printf("this dawmn null char\n");
        }
    }
}

它輸出:

l
i
n
h
a
s
this dawmn null char
史蒂夫峰會

你的循環

for (int i = 0; i <= sizeof(string); i++)

總是有點錯誤。它應該是

for (int i = 0; i < sizeof(string); i++)

通過使用<=,您在循環中進行了過多的旅行,並且您訪問了string數組之外的內存看起來,lista數組就位後,您錯誤訪問的額外字節(string數組)恰好是 0,因此您會得到“this dawmn null char”消息的額外第二次打印輸出。

但是,當您註釋掉lista數組時,一定是您錯誤訪問的額外字節不是 0,因此它會被打印為本身。它可能是一個不可見的控製字符,這就是為什麼你什麼都看不到的原因。我建議將您的代碼更改為

if (string[i] != '\0')
     printf("string contains %d\n", string[i]);
else printf("this damn null char\n");

更清楚地看到這一點。

這裡的重要教訓是,如果你有一個應該運行 N 次的循環,有兩種編寫它的方法。在 C 中,絕大多數時候,你想把它寫成

for(i = 0; i < N; i++)

這是一個“基於 0”的循環,從 0 到 N-1 運行,總共 N 次。偶爾,您需要一個基於 1 的循環:

for(i = 1; i <= N; i++)

這從 1 到 N 運行,同樣總共 N 趟。但是如果你寫

for(i = 0; i <= N; i++)      /* usually WRONG */

您的循環從 0 運行到 N,總共 N+1 趟。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何檢測TextView的最後一個字符串包含0到9

為什麼這兩個在 C 中字符相同的數組的大小會有差異?

為什麼這個計算字符串長度的 C 程序會給出錯誤的輸出?

用户字符串输入到 c 中的 \0

你如何檢查兩個字符串在字符串中的任何一點的順序是否相同?

print() 當多個字符串乘以任意數字時出錯,為什麼會發生這種情況?

有人能解釋一下這個簡單的 c 代碼會做什麼嗎?

'\ 0'末尾的C字符串

當一個字符串與另一個 C# 不完全相反時比較兩個字符串的最佳方法

解釋此 c 代碼以將第一個字符更改為大寫

c#將反轉的字符串存儲到另一個字符串中

為什麼“ios::sync_with_studio(0) 和 cin.tie(0);” 不適用於 C++ 中的字符串

為什麼這個代碼片段在 c++11 中無限打印 10?

將字符串中的字符與 C 中的另一個字符進行比較

C中带\ 0的字符串的长度

计算字符串C ++中'0'-'9'的出现次数

在C#中以'\ 0'分隔的字符串

在c ++中从1而不是0开始计算字符串

在 C# 代碼中視覺上什麼是字符串文字?

C/C++ 中不允許嵌套註釋。但是,當您嘗試將一個註釋對放入另一個註釋對時,以下錯誤意味著什麼?

如果第一個字符是 0,我如何從 python 中的字符串中排除第一個字符(在隨機生成的字符串中)

在 javascript 中的 Date 構造函數上為字符串“0”到“110”解析字符串背後的邏輯是什麼?

映射兩個不同字符串以充當一個字符串的最pythonic方法是什麼?

C字符串中'0'、0和'\0'之间的区别

嘗試將兩個字符串鏈接在一起時緩衝區溢出,為什麼會出現此錯誤?

程序在 c 中反轉字符串,但在 /0 位置打印 a

C程序-带有\ 0个字符的sizeof字符串

在字符串中添加行號時出現錯誤“檢測到堆棧粉碎”

無法比較python中的兩個字符串

TOP 榜单

热门标签

归档