當未連接的代碼行被取消註釋時,為什麼這個 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 条评论
登录 后参与评论

相关文章

'\ 0'末尾的C字符串

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

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

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

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

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

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

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

為什麼在嘗試進行貨幣計算時會收到不正確的輸入字符串錯誤?C#

打印字符串的前 N 個字符 (C)

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

這兩個 C++ 代碼片段有什麼區別

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

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

如果我在函數頂部切換註釋行的位置,為什麼我的代碼不起作用?這是一個記憶回憶聲明

檢查兩個字符串是否大小寫相同

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

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

Spark- 檢查兩個字符串列的交集

JS中如何檢查兩個字符串並確定每個字符串中是否有任何字母放在同一字母行中?

你如何在 C++ 向量中的另一個字符串中找到一個字符串/字符?[這對我行得通]

在c#中檢測字符串數組中的相同文本

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

如何在R中的兩個字符串之間提取字符串

搜索兩個字符之間的字符串

為什麼 C 中相同字符串的字符數組大小不同?

如何在 Rust 中交換字符串中的兩個字符

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

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