微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C 中将字符串添加到 Char 数组中

如何解决在 C 中将字符串添加到 Char 数组中

出于某种原因,当我打印上面的数组时,我得到了一个奇怪的输出。当我通过 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;
}

解决方法

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

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

,

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

由于您尚未初始化数组 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 是否成功。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。