首页 > 解决方案 > 为什么下面的代码会在字符串末尾执行意外的字母?

问题描述

这是我的代码

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

int countNumber(char string[],int number_[]);
int countNumber(char string[]);


int main(){
  char string[] = "tran_huynh_minh_phuc";
  int num = countNumber(string)+1;
  int *number = (int *) calloc(num, sizeof(int));
  countNumber(string,number);
  for(int i=0;i<num;i++){
    printf("%d\n",number[i]);
  }

  fflush(stdin);
  char a[3][14];

  strncpy(a[2], string+5, 5);
  printf("%s",a[2]);


} 

int countNumber(char string[],int *number)
{   int count=0; 
    int num_i=1;
    number[0]=-1;
         for(int i=0; i<strlen(string); i++)
          {
           if(string[i]=='_')
             { number[num_i] = i;
               num_i++; 
             }  
          }
    return count;
}

int countNumber(char string[])
{   int count=0; 
         for(int i=0; i<strlen(string); i++)
          {
           if(string[i]=='_')
             { 
               count++; 
             }  
          }
    return count;
}

这是我的问题控制台结果:

我正在执行程序以获取从“tran_huynh_minh”中获取“tran”、“huynh”、“minh”的子字符串,但是在我的子字符串末尾出现了一些意想不到的字母。此外,我尝试了很多方法来修复它,但它没有奏效。你能找出我的错误吗?

谢谢

明福

标签: cstring

解决方案


我认为主块底部的意图是这样的(这在复制的 'huynh' 之后添加了空值。通过添加空值,当它开始打印2时,它知道何时停止。看起来就像希望将第二个单词放在数组中的索引 2 处(大概是在它工作时在循环中完成等等):

strncpy(a[2], string + 5, 5);
a[2][5] = '\0';
printf("%s", a[2]);

如果您运行与此等效的程序,您应该会看到预期的输出。但是,您可能还会看到有关 strncpy 函数的警告并考虑使用 strncpy_s(取决于您用于编译的内容。看起来您在 Windows 上)。如果您将函数调用替换为 strncpy_s(假设为 Visual Studio),您将获得所需的结果,而无需在末尾单独添加 null。请注意,它期望目标数组的大小作为保障(在本例中为 14)。

请参阅此链接以及链接。


推荐阅读