【问题标题】:Adding Strings into a Char Array in C在 C 中将字符串添加到 Char 数组中
【发布时间】:2021-03-26 20:51:16
【问题描述】:

由于某种原因,当我打印上面的数组时,我得到了一个奇怪的输出。当我通过 WinSCP 终端运行这段代码时,它也几乎像死循环一样崩溃。但是,我主要是想修复打印输出。输入:Tom (enter) Jerry (enter) (enter to break) 输出:.N=?tom 杰瑞

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

int main()
{
    int i, counter = 0;
    char nameArr[100] ;
    
    while (1)
    {
        printf("Enter a name: ") ;
        char word[25] ;
        // Grab input
        fgets (word, sizeof(word), stdin) ;
        
        // Break if no input
        if (strcmp (word, "\n") == 0)
            break ;
        
        // Checks if there is a number in the input
        for (i = 0 ; i < strlen(word) - 1 ; i++)
        {
            int isItADigit = isdigit(word[i]) ;
            if (isItADigit != 0)
            {
                printf("No no, number detected, no bueno!") ;
                return 0 ;
            }
        }
        // Adds word to array
        strcat(nameArr, word) ;
        // Future Usage
        counter ++ ;    
    }
    
    if (counter < 2 )
    {
        printf("Name is too short\n") ;
        return 0 ;
    }
    else if (counter > 4)
    {
        printf("Name is too long\n") ;
        return 0 ;
    }
    
    //printArray(nameArr) ;
    printf("%s", nameArr) ;
    
    return 0;
}

【问题讨论】:

  • 你必须以'\0'结束一个字符串。或者程序不知道字符串在哪里结束。

标签: arrays c loops fgets strcat


【解决方案1】:

数组char nameArr[100] 未初始化,因此包含垃圾。例如,这个垃圾可能是:nameArr[0] = '.'nameArr[1] = 'N'nameArr[2] = ':'...

因此,您应该编写:char nameArr[100] = {0}; 将其初始化为 0,或者将其设为静态 static char nameArr[100];,这也会将其初始化为 0。

【讨论】:

    【解决方案2】:

    strcat 函数要求目标数组已经是正确的以 null 结尾的字符串。

    由于您还没有初始化数组nameArr,它的内容是不确定,第一次调用strcat 将导致undefined behavior

    使用前需要先初始化数组:

    char nameArr[100] = { 0 };  // Initialize to all zeros, which is the string terminator
    

    您还应该添加一个检查以确保您不会超出数组nameArr 的范围。


    在不相关的注释中,请记住 fgets 将换行符留在缓冲区中,除非您希望 nameArr 包含换行符,否则您需要将其删除。

    这可以使用strcspn 函数来完成:

    fgets (word, sizeof(word), stdin) ;
    word[strcspn(word, "\n")] = '\0';
    

    最后你应该检查fgets是否成功。

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多