簡體   English   中英

getchar() 在創建字符串數組時不讀取空格?

[英]getchar() is not reading spaces when creating string array?

我正在嘗試使用 getchar() 創建一個反向字符串,以首先讀取數組格式的字符串。 我還沒有寫反轉部分。 該代碼適用於任何沒有空格的字符串。 前任。 “你好,世界!” 將輸出“HelloWorld!” 但是“世界你好!” 只會輸出“你好”。

#include <stdio.h>

#define MAX_SIZE 100

int main() 
{
    char temp;
    char my_strg[MAX_SIZE];
    int length;

    printf("Please insert the string you want to reverse: ");
    scanf("%s", my_strg);

    while((temp = getchar()) != '\n')
    {
        my_strg[length] = temp;
        length++;
    } 

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

    return 0;
}

你的問題是scanf scanf只讀取直到遇到空格。 要解決此問題,您可以使用fgets (和strcspn刪除換行符):

if(fgets(my_strg, sizeof(my_strg), stdin) == NULL)
{
    perror("fgets");
    return EXIT_FAILURE;
}
my_strg[strcspn(my_strg, "\n")] = '\0';

或者用scanf ...

if(scanf("%99[^\n]", my_strg) != 1)
{
    fprintf(stderr, "scanf() failed to read\n");
    return EXIT_FAILURE;
}

在這些更改之后,您可以完全刪除getchar循環。

在您的程序中,您需要檢查 I/O 錯誤。 我已經向您展示了如何做到這一點。 如果您不這樣做,您的程序可能會給出不正確的輸出,或者在某些情況下會導致未定義的行為(通常會導致崩潰)。

獎勵:這是反轉字符串的方法:

size_t l = strlen(my_strg) / 2;
char *s = my_strg, *e = s + l;
while(l--)
{
    char tmp = *--e;
    *e = *s;
    *s++ = tmp;
}

程序具有未定義的行為,因為你試圖訪問的陣列,的元素my_strg[length]與一個未初始化length

為了解決這個問題,將您的聲明lengthscanf調用並將其初始化字符串的長度scanf如下:

scanf("%s", my_strg);
size_t length = strlen(my_strg);

或者,完全放棄scanf調用並將length初始化為零:

    char my_strg[MAX_SIZE] = { 0, }; // Note: make sure you ALSO initialize your array!!
    printf("Please insert the string you want to reverse: ");
    size_t length = 0;
    while ((temp = getchar()) != '\n') {
    //..

注意:如果您(出於某種原因)不想將整個數組初始化為零(就像我的第二個代碼塊中的第一行那樣),請確保在末尾添加一個零 ( nul ) 字符字符串,在打印它之前(或用它做任何其他事情)。 您可以在while循環簡單地添加這一行:

    my_strg[length] = '\0'; // "length" will already point to one-beyond-the-end

編輯:為了解決David C. Rankin在評論部分提出的非常好的觀點,您可以(應該)改進您的while循環控制以:(a)防止緩沖區溢出和(b)處理輸入錯誤條件。 像這樣的東西:

while ((length < MAXSIZE - 1) && (temp = getchar()) != '\n' && temp != EOF) {
    //..

但是您使用的確切測試和控制將取決於您希望如何處理此類問題。

根據定義, scanf("%s", my_strg)讀取字符串直到第一個空格(空格算作空格)。 所以"Hello world"將被讀取到第一個空白,即my_strg將包含"Hello" 要讀取到新行(包括換行符),請使用fgets

順便說一句:可變length未初始化,因此您會獲得未定義的行為。

暫無
暫無

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

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